了解引用计数 - Windows安装程序

时间:2014-01-20 21:50:15

标签: windows-installer reference-counting

我正在努力理解/解释为什么会发生以下情况:

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之间的引用计数将保持相似的独立/唯一。

当涉及目录的所有权并且目录的所有权必然会干扰引用计数/删除被计算的组件包装的文件时,最后一个安装程序是否会获胜?有没有人可以在这个主题上与我分享链接/文档?

1 个答案:

答案 0 :(得分:0)

“分享”有两个独立的概念。

  1. 共享组件,如果两个组件具有相同的guid,则会发生这种情况。

  2. 共享DLL,如果组件设置了sharedDllRefCount属性或文件已经存在,就会发生这种情况。

  3. 请注意,在这两种情况下,文件夹都不是共享的,而是文件(或您在组件中放置的任何资源)

    如果1和2混合,有时在卸载时不删除文件,则必须手动删除文件或correct the sharedDLL counter manually

    关于你要求的官方文件,除了这个之外我找不到多少: http://msdn.microsoft.com/en-us/library/ms709304%28v=vs.85%29.aspx