2010-03-03 93 views
4

我想讀取一個MSI文件到一個MemoryStream(或類似的),並修改它。在不影響MSI的情況下,最簡單的方法是什麼?如何修改內存中的MSI?

我需要做的就是修改MSI中某個屬性的值。我更喜歡.Net中的某些東西,但我對其他平臺開放。

更新:

這是我工作的代碼,使用Windows平臺的SDK,一個COM參考Microsoft Windows安裝程序對象庫和命名空間WindowsInstaller:

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(); 
+0

當您要進行此更改時,有點不清楚。如果在分發MSI之前,修改它可能沒問題。如果它是從其他地方獲得的(或者是從其他地方獲得的MSI),最好創建一個轉換(或者如果該屬性是公共的,也許只是在命令行中修改它)。 – 2010-03-04 14:34:01

回答

3

退房的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 
+0

我以前見過,而且它做我想做的事情。問題是,我似乎無法弄清楚我需要添加到我的項目中的引用。我已經安裝了Windows SDK(我現在正在加載樣本),但是我沒有看到它的目錄中有任何東西跳出來。 – 2010-03-04 15:06:16

+0

我想我找到了。有一個名爲Microsoft Windows Installer對象庫的COM引用,它作爲WindowsInstaller命名空間,它具有安裝程序和數據庫對象。另外,這裏是我用來在C#中完成的指南:http://bit.ly/942ZZe。當我得到它的工作時,我會報告。感謝您的好建議! – 2010-03-04 15:31:36

+0

得到它的工作。再次感謝! – 2010-03-04 15:44:36

0

即使這個帖子是真的老了,對誰發生通過搜索引擎到達這裏用戶着想,有一個非常整齊的.Net庫,它實現了Windows Installer SDK的幾乎所有功能,並由Microsoft的高級開發人員Rob Mensching主動維護。它存在於Wix工具集中,您可以獲得v3.6 RC0 here. 安裝此工具集後,請添加對此工具集的安裝目錄中存在的Microsoft.Deployment.WindowsInstaller.dll的引用,然後您就可以開始使用了。 您可以輕鬆地將整個msi數據庫加載到DataSet中,並執行所需的讀/寫操作,並最終將更改提交到msi。