为什么我的新Windows Installer文件(MSI)不能在旧版本的MSI上正确安装?

Pet*_*ens 3 windows-installer

症状

我有新创建的安装程序包(MSI),它安装了我的应用程序的新版本.

我有一个新的ProductCode用于我的安装,但我已经使UpgradeCode保持不变.

因此,当我执行新的MSI时,它首先正确卸载旧版本.甚至删除Program Files\MyProduct目录.

但卸载旧版本后,安装程序只会部分安装新版本.如果我修复损坏的新安装(使用添加删除程序 - >修改安装 - >修复),一切都已修复.

如果我首先使用"添加删除程序"卸载旧版本,然后安装新版本,则一切正常.只有当我将新版本安装在旧版本之上时,才会出现此问题.

可能的原因

旧版本中各种dll和exes的版本号都搞砸了.旧的exe版本是4.11.1234.新exe的版本是4.5.1234.根据"文件版本控制规则",新文件不会覆盖旧文件.我之间的问题是,当InstallFiles操作执行时,目标文件不再驻留在磁盘上.

其他信息

我的目标是Windows Installer 3.1.

我的安装执行顺序大致如下:

...
InstallValidate
RemoveExistingProducts
InstallInitialize
...
InstallFiles
...
InstallExecute
InstallFinalize
....
Run Code Online (Sandbox Code Playgroud)

如果这个背景没有明确问题,请告诉我......

谢谢!

Wil*_*ara 5

我假设你也改变了PackageCodeProductVersion

"我之所以挠头,是因为当InstallFiles操作执行时,目标文件不再驻留在磁盘上."

是的,但MSI决定在文件被物理删除之前安装/不安装文件 - 当第一次通过InstallExecute序列时,当文件仍在硬盘驱动器上时,该决定是在第一次通过期间做出的.

我遇到了问题,我能够通过将文件的版本更改为比硬盘驱动器上的版本更新来解决它 - 你能做到吗?

另一种选择:您使用的是InstallShield吗?您可以选择在单个文件上设置两个属性中的一个来解决问题:1)始终覆盖,2)覆盖系统版本."Always Overwrite"将自动将版本号设置为65535.0.0.0,从而启用安装."覆盖系统版本"允许您输入自己的版本,高于实际文件版本,从而也可以启用安装.右键单击该文件,然后参见"属性"以设置这些选项.