如何使用VBScript更改*.msi中包含的文件内容
给定一个VS2010安装项目生成的安装程序,我希望在不更改名称的情况下用另一个.NET DLL替换掉一个.NET DLL 我已经根据修改了如何使用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
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”上提供一个指针吗?我承认我在黑暗中摸索着一种短棒的方法。。。