代码之家  ›  专栏  ›  技术社区  ›  Daren Thomas

如何作为后期构建步骤修改/替换.msi文件的二进制文件?

  •  2
  • Daren Thomas  · 技术社区  · 14 年前

    InstallUtilLib.dll :它安装32位填充程序,对于编译为64位的CustomActions不起作用(在我的例子中这是一个要求,因为它依赖于64位本机DLL)。

    .msi 结果 System.BadImageFormat

    根据 this post (64-bit Managed Custom Actions with Visual Studio) ,解决方法是打开生成的 .msi文件 在里面 orca.exe 并替换二进制文件“InstallUtil”。

    编辑:

    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 回复  |  直到 14 年前
        1
  •  4
  •   Mike Ohlsen    14 年前

    不确定如何通过脚本、代码等实现自动化,但在任何情况下,都可以通过 Windows Installer SDK ,我相信它现在是Windows SDK的一部分(以前是平台SDK)。

    不管怎样,这里有一个VBScript,我过去曾用它手动将文件添加到MSI中。已经有一段时间了,但我只是在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
    

    希望这有帮助!

    推荐文章