在 Windows Installer 中,一切都与组件 guid 有关。如果您安装了 10 个文件,它们都将具有唯一的组件 guid。如果您对不再需要其中五个文件并替换其他五个文件的产品进行重大升级,那么显然您不会将旧文件放入升级中,而且您还添加了带有五个新组件 guid 的这五个新文件。换句话说,这些症状表明您添加了新文件但保留了现有的组件 guid。重大升级包括卸载旧产品,但使用相同的组件 guid 会导致 guid 的引用计数永远不会变为零,从而导致这些组件(以及文件)被卸载。
此外,如果组件曾经被标记为永久或文件曾经被标记为共享,那么文件将不会被删除。将组件标记为永久会将其粘贴到系统上,因此重建 MSI 并将其标记为非永久不会修复它。该组件有一个额外的记录计数。当一个文件被明确标记为共享时,这意味着它可以通过非 MSI 安装进行安装(并且不会被组件 guid 引用计数),因此注册表中的 SharedDlls 中会有一个条目,因为 MSI 被告知还有另一个非 MSI 客户端。可以在注册表中查看 SharedDlls 以查看是否发生了这种情况。组件的引用计数更难发现,但详细的升级日志会有所帮助。此 VB 脚本将显示所有已安装的组件和正在使用它们的产品:
选项显式
公共安装程序、fullmsg、comp、a、prod、fso、pname、ploc、pid、psorce
设置 fso = CreateObject("Scripting.FileSystemObject")
设置 a = fso.CreateTextFile("comps.txt", True)
' 连接到 Windows Installer 对象
设置安装程序 = CreateObject("WindowsInstaller.Installer")
a.writeline(“MSI 组件”)
错误继续下一步
对于安装程序中的每个组件。
a.writeline (comp & " 被产品使用:")
对于 Installer.ComponentClients (comp) 中的每个产品
pid = installer.componentpath (prod, comp)
pname = installer.productinfo (prod, "InstalledProductName")
a.Writeline(""&pname&""&prod&"并安装在"&pid)
下一个
下一个
enter code here