2

在 x64 系统上使用 CustomAction 构建 Visual Studio 2010 安装项目时,Visual Studio 包含错误版本InstallUtilLib.dll:它安装 32 位 shim,这对于编译为 64 位的 CustomAction 不起作用(在我的情况下是一个要求,因为它取决于在 64 位本机 dll 上)。

安装这样的.msi结果会导致System.BadImageFormat异常。

根据这篇文章 (64-bit Managed Custom Actions with Visual Studio),解决方案是打开结果.msiorca.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)。

4

1 回答 1

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

希望这可以帮助!

于 2010-07-15T15:39:16.927 回答