Visual Studio 2010 - RemovePreviousVersions

时间:2010-11-17 23:32:09

标签: visual-studio-2010 installer setup-project

我有一个Visual Studio 2010部署项目,其中包含以下设置:

DetectNewerInstalledVersion = True
InstallAllUsers = True
RemovePreviousVersions = True

我正在构建的项目有几个DLL,由于实现序列化的传统方式,此项目的文件版本无法递增(我们正在更改)。

如何让安装项目完全删除现有文件(或者至少覆盖所有新文件)?

也许我需要在安装程序中编写卸载脚本(有人可以链接我这样做,我找不到)

我环顾四周,对于任何现有的问题,他们都说“递增你的文件版本”,但对我来说,目前这不是一个选项。

3 个答案:

答案 0 :(得分:20)

使用Visual Studio(2008和2010)创建的安装项目仅在版本号增加时才替换文件。显而易见的解决方案是只增加所有版本号;但正如你所说,这对你来说是不可行的。

.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

答案 1 :(得分:1)

从2005年到2010年迁移的几个设置有同样的问题。 使用ORCA编辑了设置(.msi)文件并更改了执行顺序。 InstallInitialize之前删除ExistingProducts 这解决了安装问题。

答案 2 :(得分:0)

在新安装之前执行完全卸载的最简单方法是

  1. 转到“启动项目”,右键单击并选择“选项”。
  2. 单击“装配信息”按钮。然后递增“汇编版本”和“文件版本”值,单击“确定”。
  3. 然后转到您的安装项目。确保“DetectNewInstalledVersion”设置为true,“RemovePreviousVersion”为true,然后将“version”增加,例如从1.0.0增加到1.0.1,然后会出现一个对话框,要求您更新你的“ProductCode”,只需选择“是”。确保“重建”您的启动项目,然后重建您的安装项目。
  4. 这样就可以了。请享用。然后在您的安装文件夹上“右键单击”并选择“在Windows资源管理器中打开文件夹”并查看“发布”文件夹下的内容。