2010-07-15 55 views
2

在x64系統上使用CustomAction構建Visual Studio 2010安裝項目時,Visual Studio包含InstallUtilLib.dll的錯誤版本:它安裝32位墊片,這對於編譯爲64位的CustomActions不起作用(在我的情況下,因爲它取決於64位本地dll)。如何修改內容/將.msi文件的二進制文件替換爲構建後步驟?

安裝這樣的.msi會導致System.BadImageFormat異常。

根據this post (64-bit Managed Custom Actions with Visual Studio),解決方法是打開.msi的結果orca.exe並替換二進制「InstallUtil」。

我想自動執行此操作。有任何想法嗎?

編輯:基於由mohlsen提供的答案,我添加下面的腳本解決方案(不安裝項目本身,文件添加到安裝項目進入MSI ...):

Option Explicit 
rem ----------------------------------------------------------- 
rem Setup_PostBuildEvent_x64.vbs 
rem 
rem Patch an msi with the 64bit version of InstallUtilLib.dll 
rem to allow x64 built managed CustomActions. 
rem -----------------------------------------------------------  

Const msiOpenDatabaseModeTransact = 1 
Const msiViewModifyAssign   = 3 

rem path to the 64bit version of InstallUtilLib.dll 
Const INSTALL_UTIL_LIB_PATH = "C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtilLib.dll" 

Dim installer : Set installer = Wscript.CreateObject("WindowsInstaller.Installer") 

Dim sqlQuery : sqlQuery = "SELECT `Name`, `Data` FROM Binary" 

Dim database 
Set database = installer.OpenDatabase(Wscript.Arguments(0), msiOpenDatabaseModeTransact) 
Dim view : Set view = database.OpenView(sqlQuery) 

Dim record : Set record = installer.CreateRecord(2) 
record.StringData(1) = "InstallUtil" 
view.Execute record 

record.SetStream 2, INSTALL_UTIL_LIB_PATH 

view.Modify msiViewModifyAssign, record 
database.Commit 

Set view = Nothing 
Set database = Nothing 

接下來,我編輯的設置項目屬性:我設置PostBuildEvent屬性:

wscript.exe "$(ProjectDir)\..\Setup_PostBuildEvent_x64.vbs" $(BuiltOuputPath) 

:右鍵單擊搜索解決方案安裝項目然後選擇「屬性」打開錯誤的對話框(「屬性頁面」)。你想要「屬性窗口」(CTRL + W,P)。

+1

唉!必須使用「rem」而不是'評論才能使語法突出顯示不會太多...... – 2010-07-16 08:29:05

回答

4

不知道如何通過腳本,代碼等來自動執行此操作。但無論如何,這個功能都可以通過Windows Installer SDK獲得,我相信它現在是Windows SDK的一部分(曾經是平臺SDK)。

無論如何,這裏是我過去用來手動添加文件到MSI的VBScript。它已經有一段時間了,但我只是將它運行在MSI上進行測試,並使用Orca進行驗證,並將程序集添加到二進制表中。這應該指向你正確的方向。

Option Explicit 

Const msiOpenDatabaseModeTransact  = 1 
Const msiViewModifyAssign   = 3 

Dim installer : Set installer = Nothing 
Set installer = Wscript.CreateObject("WindowsInstaller.Installer") 

Dim sqlQuery : sqlQuery = "SELECT `Name`,`Data` FROM Binary" 

Dim database : Set database = installer.OpenDatabase("YourInstallerFile.msi", msiOpenDatabaseModeTransact) 
Dim view  : Set view = database.OpenView(sqlQuery) 
Dim record 

Set record = installer.CreateRecord(2) 
record.StringData(1) = "InstallUtil" 
view.Execute record 

record.SetStream 2, "InstallUtilLib.dll" 

view.Modify msiViewModifyAssign, record 
database.Commit 
Set view = Nothing 
Set database = Nothing 

希望這會有所幫助!

+0

哇,謝謝!將立即檢查。我會發布,如果我得到它的工作! – 2010-07-16 07:15:20

+0

我目前正在嘗試此腳本,但出現以下錯誤:「錯誤:修改,模式,記錄」 「代碼:80004005」 – arc1880 2013-11-21 00:06:25

相關問題