我有一个名为MSICREATE的程序创建的.msi文件,并使用orca进行了如下修改...
InstallExecuteSequence表
* added FindRelatedProducts with sequence 410
* added RemoveExistingProducts with sequence 1450
InstallUISequence表
* added FindRelatedProducts with sequence 200
PropertyTable
* added RemovePreviousVersions TRUE
* added SECURECUSTOMPROPERTIES SOLARUPGRADE
* had a existing UpgradeCode with guid created by MSICREATE
* had a existing ProductVersion 12.2.12.0 created my MSICREATE
添加了升级表
* UpgradeCode same value as Upgrade in Property Table
* VersionMin null
* VersionMax 99.12.31
* Attributes 1
* ActionProperty SOLARUPGRADE (same value as SECURECUSTOMPROPERTIES in Property Table)
我还分配了一个新的PackageCode和一个新的ProductCode,因此新的msi具有与以前安装的产品不同的PackageCode,ProductCode和ProductVersion值。
当我使用之前安装的产品运行此msi时,将删除旧产品,创建新的程序文件目录,并从新的.msi重新安装除.exe之外的所有文件。修复将导致.exe被创建。如果在删除旧产品后安装新的msi(使用控制面板添加/删除程序),则会安装包括.exe在内的所有文件。
msiexec日志文件是mywebspace.wisc.edu/mdorl/msilog/log3.log
.msi是mywebspace.wisc.edu/mdorl/msilog/sbl_Major_Upgrade.msi
对我来说,唯一看起来很奇怪的是日志中的以下几行。第一个,第二个和第四个是安装的文件,第三个是未安装的.exe文件。 注意此次入场时的无效操作。
Action start 8:04:41: InstallValidate.
MSI (s) (18:F4) [08:04:41:671]: Feature: _MainFeature; Installed: Absent; Request: Local; Action: Local
MSI (s) (18:F4) [08:04:41:671]: Component: _24A30964F6B6462282E161248AF15827; Installed: Absent; Request: Local; Action: Local
MSI (s) (18:F4) [08:04:41:671]: Component: _7B95B32E33EB4F699B44D53CA5BC22B5; Installed: Absent; Request: Local; Action: Local
MSI (s) (18:F4) [08:04:41:671]: Component: _2FBD153583AF40C09EB9920149F7C7B7; Installed: Absent; Request: Local; Action: Null
MSI (s) (18:F4) [08:04:41:671]: Component: _38A400D7DB76479CA0EC6D643D5793CD; Installed: Absent; Request: Local; Action: Local
答案 0 :(得分:1)
如果您查看第603行的日志,您会发现以下内容:
MSI(18:10)[08:04:41:827]:禁止卸载组件:{ADC6C3E9-A0CF-4AFC-9998-7B9449C8EA10},因为存在另一个客户端 MSI(s)(18:10)[08:04:41:827]:禁止卸载组件:{F74907E7-607E-49D1-B613-D63A36ADB020}因为存在另一个客户端 MSI(s)(18:10)[08:04:41:827]:不允许卸载组件:{B1FE4023-E176-42BC-92C3-15B8E50CFBB0},因为存在另一个客户端 MSI(s)(18:10)[08:04:41:827]:禁止卸载组件:{E6F5DF5D-3460-4B44-8743-48787E68A2C1},因为另一个客户端存在
如果在同一台计算机上安装的多个软件包之间共享相同的组件,则会发生这种情况。 Windows Installer会保留组件的引用计数,并允许删除它们,直到删除所有使用它们的应用程序。
如果您在测试/开发机器上遇到这种情况,我建议您在干净的VM上进行测试,以确保没有其他先前的测试会影响这个测试。
另外,如果您知道在其他应用程序的包中使用了相同的组件,请编辑它们,确保每个组件对每个包都有唯一的GUID。
答案 1 :(得分:1)
Windows Installer使用密钥文件来检测组件及其GUID,以下是更多详细信息: http://msdn.microsoft.com/en-us/library/windows/desktop/aa370561(v=vs.85).aspx
如您所料,Windows Installer也在检查文件版本,我假设您在新版本中正确递增。以下是遵循的规则: http://msdn.microsoft.com/en-us/library/windows/desktop/aa368599(v=vs.85).aspx
您需要将文件表中的版本列设置为比计算机上已存在的版本更高的值,否则Windows Installer将决定更好地保留旧版本,因为它具有更高的值版本
答案 2 :(得分:1)
为了对这个项目进行一些封闭,这是我发现的以及我为解决问题所采取的措施。
1)我对版本化/无版本文件的含义仍然模糊不清。我想所有的.exe文件都是版本的。我想这意味着这些文件需要File表中的相应版本。
2)我现在明白文件表版本需要没有与ProductVersion的连接。
3)我一直在使用非法的ProductVersion例如。 2012.02.16。我转而使用像12.2.16这样的东西。
4)我在Visual Studio中设置.exe VS_VERSION_INFO FILEVERSION,并将相同的值添加到File table Version字段。
现在,当我进行重大升级时,所有文件都会被替换。
答案 3 :(得分:0)
文件表ALL中的条目没有版本。为什么非.exe文件的处理方式不同并重新安装?
我认为其他文件的版本增加了。 Windows Installer应对程序包中的所有文件应用版本控制规则。
所以这意味着用户无法使用主要的升级msi安装旧版本的产品?
如果您想在新软件包中保持较小的版本,我没有看到解决方案。当然,除了自定义操作。
什么构成合法版本?在一个地方我看到255.255.65535而在另一个地方我看到65535.65535.65535.65535
它们都是正确的版本号。后一个值通常设置为一个文件,以确保它替换机器中的任何其他现有文件,即它是操作系统允许的最高版本号。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa368596(v=vs.85).aspx