我正在努力理解/解释为什么会发生以下情况:
1)A.msi创建一个目录\ path \ to \ foo
2)B.msi使用注册表找到\ path \ to \ foo并将更多文件添加到该位置
3)如果卸载了B.msi,则添加的附加文件将被删除
4)如果在卸载B.msi之前安装了较新版本的A.msi(主要升级),则后续卸载B.msi会将其添加到\ path \的文件保留为\ foo。 msiexec / x日志记录如下所示:
(SERVER) MSI (s) (60:08) [14:09:33:018]: Disallowing uninstallation of component:
{BIFF} since another client exists
(SERVER) MSI (s) (60:08) [14:09:33:019]: Disallowing uninstallation of component:
{BAM} since another client exists
(SERVER) MSI (s) (60:08) [14:09:33:019]: Disallowing uninstallation of component:
{HARVEY} since another client exists
(SERVER) MSI (s) (60:08) [14:09:33:019]: Disallowing uninstallation of component:
{ETC} since another client exists
所以,显然,引用计数,对吗?但不是以我理解的方式。我原以为,由于每个文件都是用组件单独包装的,组件guids是唯一的,因此两个MSI之间的引用计数将保持相似的独立/唯一。
当涉及目录的所有权并且目录的所有权必然会干扰引用计数/删除被计算的组件包装的文件时,最后一个安装程序是否会获胜?有没有人可以在这个主题上与我分享链接/文档?
答案 0 :(得分:0)
“分享”有两个独立的概念。
共享组件,如果两个组件具有相同的guid,则会发生这种情况。
共享DLL,如果组件设置了sharedDllRefCount属性或文件已经存在,就会发生这种情况。
请注意,在这两种情况下,文件夹都不是共享的,而是文件(或您在组件中放置的任何资源)
如果1和2混合,有时在卸载时不删除文件,则必须手动删除文件或correct the sharedDLL counter manually
关于你要求的官方文件,除了这个之外我找不到多少: http://msdn.microsoft.com/en-us/library/ms709304%28v=vs.85%29.aspx