我有一个Visual Studio 2010部署项目,其中包含以下设置:
DetectNewerInstalledVersion = True
InstallAllUsers = True
RemovePreviousVersions = True
我正在构建的项目有几个DLL,由于实现序列化的传统方式,此项目的文件版本无法递增(我们正在更改)。
如何让安装项目完全删除现有文件(或者至少覆盖所有新文件)?
也许我需要在安装程序中编写卸载脚本(有人可以链接我这样做,我找不到)
我环顾四周,对于任何现有的问题,他们都说“递增你的文件版本”,但对我来说,目前这不是一个选项。
答案 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)
在新安装之前执行完全卸载的最简单方法是
DetectNewInstalledVersion
”设置为true,“RemovePreviousVersion
”为true,然后将“version”增加,例如从1.0.0增加到1.0.1,然后会出现一个对话框,要求您更新你的“ProductCode”,只需选择“是”。确保“重建”您的启动项目,然后重建您的安装项目。 这样就可以了。请享用。然后在您的安装文件夹上“右键单击”并选择“在Windows资源管理器中打开文件夹”并查看“发布”文件夹下的内容。