4

我想将 MSI 文件读入 MemoryStream (或类似的东西),然后修改它。在不破坏 MSI 的情况下,最简单的方法是什么?

我需要做的就是修改 MSI 中属性之一的值。我更喜欢 .Net 中的东西,但我对其他平台持开放态度。

更新:

这是我的工作代码,使用 Windows 平台 SDK、对 Microsoft Windows Installer 对象库和命名空间 WindowsInstaller 的 COM 引用:

Installer installer = Activator.CreateInstance(Type.GetTypeFromProgID("WindowsInstaller.Installer")) as Installer;

Database msi = installer.OpenDatabase("WixTest.msi", MsiOpenDatabaseMode.msiOpenDatabaseModeTransact);

View view = msi.OpenView("update `Property` SET `Property`.`Value`='99' where `Property`='USERID'");

view.Execute(null);

msi.Commit();
4

2 回答 2

4

查看Windows SDK,其中包含大量使用Windows Installer API的示例。

这是我用来执行此操作的命令行 VBScript 的简化版本:

Option Explicit


Const msiOpenDatabaseModeReadOnly     = 0
Const msiOpenDatabaseModeTransact     = 1

Dim openMode : openMode = msiOpenDatabaseModeTransact

Dim argCount:argCount = Wscript.Arguments.Count

If (argCount < 3) Then  WScript.Echo "usage: msisetproperty.vbs <msi> <property> <value>" :     WScript.Quit 1

Dim MY_MSI : MY_MSI = Wscript.Arguments(0)
Dim sProp1 : sProp1 = Wscript.Arguments(1)
Dim sVal1  : sVal1 = Wscript.Arguments(2)

Dim filesys : Set filesys=CreateObject("Scripting.FileSystemObject")

If Not filesys.FileExists(MY_MSI) Then WScript.Echo "Unable to find msi, exiting" : WScript.Quit 1

Dim installer, database, view, result

Set installer = CreateObject("WindowsInstaller.Installer")
Dim sumInfo  : Set sumInfo = installer.SummaryInformation(MY_MSI, 0)

Set database = installer.OpenDatabase (MY_MSI, openMode)

Set view = database.OpenView ("UPDATE Property SET Value='" & sVal1 & "' WHERE Property='" & sProp1 & "'")
view.Execute

database.Commit
Set database = nothing
于 2010-03-03T23:36:44.060 回答
0

尽管这篇文章很老了,但为了碰巧通过搜索引擎到达这里的用户,有一个非常简洁的 .Net 库,它几乎实现了 Windows Installer SDK 的所有功能,并由 Rob Mensching 积极维护,微软高级开发人员。它存在于 Wix 工具集中,您可以在此处获得 v3.6 RC0。 安装此工具集后,在此工具集的安装目录中添加对 Microsoft.Deployment.WindowsInstaller.dll 的引用,一切顺利。您可以轻松地将整个 msi 数据库加载到 DataSet 中并执行所需的读/写操作,最后将更改提交到 msi。

于 2012-05-03T12:37:28.927 回答