4

MSIファイルをMemoryStream(または同様のもの)に読み込んで変更したいのですが。MSIを破壊せずにこれを行う最も簡単な方法は何ですか?

私ができる必要があるのは、MSIのプロパティの1つの値を変更することだけです。.Netで何かをしたいのですが、他のプラットフォームを利用できます。

アップデート:

これは、WindowsプラットフォームSDK、MicrosoftWindowsインストーラーオブジェクトライブラリおよび名前空間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インストーラー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

この投稿は本当に古いものですが、検索エンジンを介してここにたまたまアクセスするユーザーのために、WindowsインストーラSDKのほぼすべての機能を実装し、RobMenschingによって積極的に保守されている非常に優れた.Netライブラリがあります。 Microsoftのシニア開発者。Wixツールセットに存在し、ここでv3.6RC0を入手できます。 このツールセットをインストールした後、このツールセットのインストールディレクトリにあるMicrosoft.Deployment.WindowsInstaller.dllへの参照を追加すると、準備が整います。msiデータベース全体をDataSetに簡単にロードし、必要な読み取り/書き込み操作を実行して、最後に変更をmsiにコミットできます。

于 2012-05-03T12:37:28.927 に答える