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

鉴于使用VS2010安装项目生成的安装程序,我想在不更改名称的情况下将.NET DLL替换为另一个。 我已经根据这个问题改变了
msi
文件,交换了“二进制”表中条目的内容。 我使用Orca找到了有问题的文件。它驻留在唯一的cabinet文件中。我已将此cabinet文件放在“Media”表中。我不确定如何更改此cabinet文件(API),我怀疑我也必须更改MSI数据库中的某些信息(“MsiAssemblyName”表中的程序集的“ProcessorArchitecture”记录)。 理由:我正在为Autodesk Revit 2011插件制作安装程序。这些是使用组件
RevitAddinUtility.dll
注册的,必须与安装程序捆绑在一起。这个程序集有两种形式,一种用于32位,另一种用于64位安装。我需要在创建安装程序时交换正确的版本,以避免编写多个安装程序。     
已邀请:
查看本文,了解实现目标的更简单方法: 适用于32位和64位系统的RevitAddIntility     
这是我在此期间使用的解决方法: 添加两个文件,一个名为
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
    

要回复问题请先登录注册