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

时间:2010-08-24 11:54:24

标签: vbscript windows-installer setup-project orca

鉴于使用VS2010安装项目生成的安装程序,我想在不更改名称的情况下将.NET DLL替换为另一个。

我已经根据this question更改了msi文件,更换了“二进制”表中条目的内容。

我使用Orca找到了有问题的文件。它驻留在唯一的cabinet文件中。我已将此cabinet文件放在“Media”表中。我不知道如何更改此cabinet文件(API),我怀疑我必须更改MSI数据库中的某些信息(“MsiAssemblyName”表中的程序集的“ProcessorArchitecture”记录)。

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

2 个答案:

答案 0 :(得分:1)

查看本文,了解实现目标的更简便方法:

<强> RevitAddInUtility for 32 and 64 Bit Systems

答案 1 :(得分:0)

这是我在此期间使用的解决方法:

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

    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