Setup Project不替换程序集文件

时间:2010-11-03 12:33:55

标签: installer installation windows-installer

  1. 我有一个Windows应用程序项目 (A.exe)调用另一个项目 班级图书馆(B.dll)。

  2. A.exe有一个按钮(myButton) 从B.dll调用Method1方法。

  3. 安装我创建的应用程序 一个安装项目ASetup.vdproj,其中 主要产出是项目A.

  4. 编译完设置后, 安装运行没有任何 问题,当A.exe开始和我 点击myButton,aplication给出 没错。

  5. 然后我改变了B.dll并添加了一个新的 方法方法2.

  6. myButton现在正在调用Method2 B.dll而不是Method1。

  7. 我增加了A.exe和。的版本 增加版本 ASetup.vdproj,但不要增加 B.dll的版本。

  8. 安装应用程序后我 注意到我有两个装置 控制面板中的A.exe - >添加/ 删除程序。

  9. 运行A.exe并单击 myButton我得到一个错误,“ 方法2未找到方法2 B.dll“,这意味着设置确实如此 在此期间不能取代B.dll 安装。

  10. 我跑了卸载,我注意到了  没有删除文件  来自磁盘。

  11. 我的问题是:

    为什么第二次安装没有更新B.dll? 如果B.dll的版本增加,则B.dll将在安装期间被替换,但问题是我的当前项目有许多外部程序集,如果它们已被修改则难以控制。基本上,我想要的是在每次安装中都替换所有的汇编文件。

    我等待你们所有人的反馈。 感谢您的关注。

2 个答案:

答案 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