Visual Studio 2010 - RemovePreviousVersions

Seph picture Seph · Nov 18, 2010 · Viewed 12.2k times · Source

I have a Visual Studio 2010 Deployment Project with the following settings:

DetectNewerInstalledVersion = True
InstallAllUsers = True
RemovePreviousVersions = True

The project I am building has several DLLs that due to the legacy way that serialization was implemented the file versions for this project can not be incremented (which we are in the process of changing).

How can I get the setup project to remove the existing files entirely (or at least overwrite with all the new files)?

Maybe I need to script an uninstall in the installer (can someone link me to do this, I can't find)

I have looked around and for any existing questions and they all say "increment your file versions", however for me this is not currently an option.

Answer

Dirk Vollmar picture Dirk Vollmar · Nov 18, 2010

The setup project created with Visual Studio (2008 and 2010) will only replace files if the version number has been incremented. The obvious solution would be to just increment all version numbers; but as you said this is not feasible for you.

The behavior of the .msi file is basically determined by the moment when the RemoveExistingProducts action is executed. Installers created with VS 2008 schedule this action after the new product has been installed. Modified assemblies whose version has not been incremented therefore don't get replaced. Some more details about the update behavior are described in this thread:

RemovePreviousVersions=True but previous version is not removed from the target machine

To change the behavior, you can patch the created .msi file so that the RemoveExistingProducts action is executed before the new product gets installed (this actually has been the behavior if you created the setup with Visual Studio 2005). Patching can e.g. be done using a small VBScript that runs as a post-built step:

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