Installation 安装项目不替换程序集文件
我有一个Windows应用程序项目 (A.exe)调用另一个项目 类库(B.dll)Installation 安装项目不替换程序集文件,installation,windows-installer,Installation,Windows Installer,我有一个Windows应用程序项目 (A.exe)调用另一个项目 类库(B.dll) A.exe有一个按钮(myButton),用于 从B.dll调用方法Method1 安装我创建的应用程序 安装项目ASetup.vdproj,其 主要输出是项目A 编译安装程序后 安装运行时没有任何 问题,当A.exe启动并且我 单击My按钮,应用程序将给出 没有错误 然后我更改了B.dll并添加了一个新的 方法2 myButton现在正在从调用Method2 B.dll而不是Method1 我增加了A.exe
感谢您的关注。添加/删除程序中的两个条目告诉我您更改了ProductCode属性,但升级表中没有有效的行来正确定义主要升级。MSI将其视为两个不同的产品,它们恰好安装到同一目录中。卸载这两个产品中的一个时,文件将保留,直到卸载另一个产品
未被覆盖的DLL向我表明,您没有将AssemblyFileVersion属性从一个版本更改为另一个版本。第一次安装是在1.0.0.0中复制的,第二次安装说“1.0.0.0已经存在,这里没有什么要做的”并跳过它。除了@Christopher Painter提到的问题外,很可能还有另一个问题:使用Visual Studio(2008)创建的安装项目仅在版本号增加时才会替换文件。显而易见的解决方案是增加所有版本号;然而,这可能并不总是你想要的 .msi文件的行为基本上由执行操作的时刻决定。使用VS 2008创建的安装程序在安装新产品后安排此操作。因此,版本未增加的已修改程序集不会被替换。有关更新行为的更多详细信息,请参见本线程: 要更改该行为,可以修补已创建的.msi文件,以便在安装新产品之前执行该操作(如果使用Visual Studio 2005创建安装程序,则实际上就是这种行为)。例如,可以使用一个小的VBScript进行修补,该脚本作为后期构建步骤运行:
Dim objInstaller
Dim objDatabase
Dim objView
Dim objResult
Dim strPathMsi
If WScript.Arguments.Count <> 1 Then
WScript.Echo "Usage: cscript fixRemovePreviousVersions.vbs <path to MSI>"
WScript.Quit -1
End If
strPathMsi = WScript.Arguments(0)
Set objInstaller = CreateObject("WindowsInstaller.Installer")
Set objDatabase = objInstaller.OpenDatabase(strPathMsi, 1)
Set objView = objDatabase.OpenView("UPDATE InstallExecuteSequence SET Sequence=1450 WHERE Action='RemoveExistingProducts'")
WScript.Echo "Patching install sequence: UPDATE InstallExecuteSequence SET Sequence=1450 WHERE Action='RemoveExistingProducts'"
objView.Execute
objDatabase.Commit
WScript.Quit 0
Dim objInstaller
Dim objDatabase
模糊objView
模糊目标结果
暗strPathMsi
如果WScript.Arguments.Count为1,则
Echo“用法:cscript fixRemovePreviousVersions.vbs”
WScript.Quit-1
如果结束
strPathMsi=WScript.Arguments(0)
设置objInstaller=CreateObject(“WindowsInstaller.Installer”)
设置objDatabase=objInstaller.OpenDatabase(strPathMsi,1)
Set objView=objDatabase.OpenView(“更新InstallExecuteSequence Set Sequence=1450,其中Action='RemoveExistingProducts'))
Echo“修补安装顺序:更新InstallExecuteSequence SET sequence=1450,其中Action='RemoveExistingProducts'”
objView.Execute
objDatabase.Commit
WScript.0退出
我一直在使用VDPROJ,很快你就会有几十个这样的后期构建脚本来回避VDPROJ糟糕的事实。现在将VDPROJ转储为另一个工具(WiX或IS 2010 LE),您将拥有更长的使用寿命。:-)顺便说一句,在我的CM专家说,它是疯狂的故意船舶2 MSI的不同程序集具有相同的文件版本。可追溯性是至关重要的。@Christopher Painter:没错。这个“SET Sequence=1450”命令的意义是什么?有没有办法查看我假设嵌入在MSI某处的“数据库”?@Qwertie:这会改变安装过程中执行RemoveExistingProducts操作的时刻。如果您想查看MSI数据库,可以使用Orca()。@Qwertie:the.MSI文件是一个数据库。