我有一个Windows应用程序项目 (A.exe)调用另一个项目 班级图书馆(B.dll)。
A.exe有一个按钮(myButton) 从B.dll调用Method1方法。
安装我创建的应用程序 一个安装项目ASetup.vdproj,其中 主要产出是项目A.
编译完设置后, 安装运行没有任何 问题,当A.exe开始和我 点击myButton,aplication给出 没错。
然后我改变了B.dll并添加了一个新的 方法方法2.
myButton现在正在调用Method2 B.dll而不是Method1。
我增加了A.exe和。的版本 增加版本 ASetup.vdproj,但不要增加 B.dll的版本。
安装应用程序后我 注意到我有两个装置 控制面板中的A.exe - >添加/ 删除程序。
运行A.exe并单击 myButton我得到一个错误,“ 方法2未找到方法2 B.dll“,这意味着设置确实如此 在此期间不能取代B.dll 安装。
我跑了卸载,我注意到了 没有删除文件 来自磁盘。
我的问题是:
为什么第二次安装没有更新B.dll? 如果B.dll的版本增加,则B.dll将在安装期间被替换,但问题是我的当前项目有许多外部程序集,如果它们已被修改则难以控制。基本上,我想要的是在每次安装中都替换所有的汇编文件。
我等待你们所有人的反馈。 感谢您的关注。
答案 0 :(得分:6)
“添加/删除程序”中的2个条目告诉我您更改了ProductCode属性,但在升级表中没有有效行来正确定义主要升级。 MSI将此视为两种恰好安装在同一目录中的不同产品。当您卸载其中一个产品时,文件将保留,直到您卸载其他产品为止。
未被覆盖的DLL告诉我您没有将AssemblyFileVersion属性从一个构建更改为另一个构建。第一个安装在1.0.0.0中复制,第二个安装说“1.0.0.0已经存在,这里没什么可做的”并跳过它。
答案 1 :(得分:2)
除了@Christopher Painter提到的问题之外,很可能还有另一个问题:使用Visual Studio(2008)创建的安装项目只会在版本号增加时替换文件。显而易见的解决方案是只增加所有版本号;但是,这可能并不总是你想要的。
.msi文件的行为基本上取决于执行RemoveExistingProducts操作的时刻。使用VS 2008创建的安装程序在安装新产品后安排此操作。因此,版本未增加的已修改程序集不会被替换。有关更新行为的更多详细信息,请参见此主题:
RemovePreviousVersions=True
but previous version is not removed from the target machine
要更改行为,您可以修补创建的.msi文件,以便在安装新产品之前执行RemoveExistingProducts操作(如果您创建了这个行为,这实际上就是这种行为使用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