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

如何使用VBScript更改*.msi中包含的文件内容,vbscript,windows-installer,setup-project,orca,Vbscript,Windows Installer,Setup Project,Orca,给定一个VS2010安装项目生成的安装程序,我希望在不更改名称的情况下用另一个.NET DLL替换掉一个.NET DLL 我已经根据修改了msi文件,交换了“Binary”表中某个条目的内容 我使用Orca找到了有问题的文件。它位于唯一的CAB文件中。我已在“媒体”表中找到此文件柜文件。我不确定如何更改这个CAB文件(API),我怀疑我也必须更改MSI数据库中的一些信息(“MSIAmblyName”表中程序集的“ProcessorArchitecture”记录) 理由:我正在为Autodesk

给定一个VS2010安装项目生成的安装程序,我希望在不更改名称的情况下用另一个.NET DLL替换掉一个.NET DLL

我已经根据修改了
msi
文件,交换了“Binary”表中某个条目的内容

我使用Orca找到了有问题的文件。它位于唯一的CAB文件中。我已在“媒体”表中找到此文件柜文件。我不确定如何更改这个CAB文件(API),我怀疑我也必须更改MSI数据库中的一些信息(“MSIAmblyName”表中程序集的“ProcessorArchitecture”记录)


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

在此期间,我使用了一个解决方法:

  • 添加两个文件,一个名为
    RevitAddinUtility.dll
    另一个名为
    RevitAddinUtility64.dll
  • 在PostBuild事件中,询问用户安装项目是否应为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
    

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


啊,是的。我确实读过它,脑子里对它的含义有点放屁。谢谢(但这个问题本身还没有得到回答——我希望看到替换msi中文件的一般情况的答案!)没有这样的一般情况。更新安装程序源并重新生成MSI。您是否曾经进入一个构建的程序集并使用IL汇编程序更新一个类?MSI的本应是可转换的,但这超出了转换的范围。很抱歉,您刚才以几种方式破坏了安装。例如,您更改了程序集的名称,但没有更改实际内容(这将破坏.NET程序集),并且还通过更改键路径而没有更改ComponentID创建了组件规则冲突,在将程序集添加到安装之前,我更改了程序集的名称,然后将其更改回真实名称。你能在“keypath”上提供一个指针吗?我承认我在黑暗中摸索着一种短棒的方法。。。