如何使用 VBScript 更改 *.msi 中包含的文件的内容

发布于 2024-09-15 22:30:13 字数 601 浏览 4 评论 0原文

给定一个使用 VS2010 安装项目生成的安装程序,我想将 .NET DLL 替换为另一个,而不更改名称。

我已经根据 此问题,交换“二进制”表中条目的内容。

我已经使用 Orca 找到了有问题的文件。它存在于唯一的内阁文件中。我已在“媒体”表中找到此内阁文件。我不确定如何更改此压缩文件 (API),并且我怀疑我也必须更改 MSI 数据库中的一些信息(“MsiAssemblyName”表中程序集的“ProcessorArchitecture”记录)。

理由:我正在为 Autodesk Revit 2011 插件制作安装程序。这些是使用程序集 RevitAddinUtility.dll 注册的,该程序集必须与安装程序捆绑在一起。该程序集有两种版本,一种用于 32 位安装,一种用于 64 位安装。我需要在创建安装程序时换入正确的版本,以避免编写多个安装程序。

Given an installer generated with a VS2010 Setup Project, I would like to swap out a .NET DLL with another one without changing the name.

I am already altering the msi file according to this question, swapping out the contents of an entry in the "Binary" table.

I have located the file in question using Orca. It resides in the only cabinet file. I have located this cabinet file in the "Media" table. I'm not sure how to change this cabinet file (API) and I suspect I'd have to change some information in the MSI database too (the "ProcessorArchitecture" record for the assembly in the "MsiAssemblyName" table).

Rationale: I'm making an installer for a Autodesk Revit 2011 plugin. These are registered using an assembly RevitAddinUtility.dll which must be bundled with the installer. This assembly comes in two flavors, one for 32-bit and one for 64-bit installations. I need to swap in the correct version when creating the installer, to avoid writing more than one installers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

地狱即天堂 2024-09-22 22:30:13

这是我同时使用的一种解决方法:

  • 添加两个文件,一个名为 RevitAddinUtility.dll,另一个名为 RevitAddinUtility64.dll
  • 在 PostBuild-Event 中 ,询问用户是否安装项目应该适用于 64 位。
  • 如果是,则更改文件名:

    If 6 = MsgBox("Build for 64bit?", 4, "Setup PostBuild event for DesignPerformanceViewer") 那么
        昏暗安装程序:设置安装程序 = Wscript.CreateObject("WindowsInstaller.Installer")
        昏暗数据库:设置数据库 = installer.OpenDatabase(PATH_TO_MSI, msiOpenDatabaseModeTransact)
        Dim sqlQuery : sqlQuery = "从文件中选择 `FileName`, `Component_`"
        昏暗视图:设置视图=database.OpenView(sqlQuery)
        查看.执行
        昏暗记录:设置记录= view.Fetch
        虽然不记录什么都不是        
            如果 InStr(record.StringData(1), "RevitAddInUtility.dll") 那么  
                record.StringData(1) = "REVITA~2.DLL|RevitAddInUtility32.dll"
                view.Modify msiViewModifyUpdate,记录    
            ElseIf InStr(record.StringData(1), "RevitAddInUtility64.dll") 然后    
                record.StringData(1) = "REVITA~1.DLL|RevitAddInUtility.dll"
                view.Modify msiViewModifyUpdate,记录    
            结束如果    
            设置记录 = view.Fetch
        文德
        数据库.提交   
    结束如果
    

Here is a workaround I'm using in the meantime:

  • add both files, one named RevitAddinUtility.dll the other RevitAddinUtility64.dll
  • in the PostBuild-Event, ask the user if the setup project should be for 64bit.
  • if yes, then change the names of the files:

    If 6 = MsgBox("Build for 64bit?", 4, "Setup PostBuild event for DesignPerformanceViewer") Then
        Dim installer : Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
        Dim database : Set database = installer.OpenDatabase(PATH_TO_MSI, msiOpenDatabaseModeTransact)
        Dim sqlQuery : sqlQuery = "SELECT `FileName`, `Component_` FROM File"
        Dim view : Set view = database.OpenView(sqlQuery)
        view.Execute
        Dim record : Set record = view.Fetch
        While Not record Is Nothing        
            If InStr(record.StringData(1), "RevitAddInUtility.dll") Then  
                record.StringData(1) = "REVITA~2.DLL|RevitAddInUtility32.dll"
                view.Modify msiViewModifyUpdate, record    
            ElseIf InStr(record.StringData(1), "RevitAddInUtility64.dll") Then    
                record.StringData(1) = "REVITA~1.DLL|RevitAddInUtility.dll"
                view.Modify msiViewModifyUpdate, record    
            End If    
            Set record = view.Fetch
        Wend
        database.Commit   
    End If
    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文