使 Wix 不卸载常见的 dll

Make Wix to not uninstall common dll

我有一个 Wix 项目,如果没有,我需要安装一个常用的 dll 库。 如果这个 dll 存在,我不应该覆盖它。 所以,当我设置 DefaultVersion="0.0.0.0" 时,如果这个 dll 存在,它不会被覆盖,没问题。但是当我删除应用程序时,dll 被删除了。如果安装前存在 dll,如何防止删除它? 我不想让它永久化,因为如果它在安装前不存在就应该被删除。

<Component Id="myLib.dll" Permanent="no"  Directory="Shared_Dir">
            <File Name="myLib.dll" KeyPath="yes" 
                  Source="mySource\myLib.dll"
                  DefaultVersion="0.0.0.0"
                  />
  1. 在您的代码中向 Wix 元素添加对 WixUtilExtensionxmlns:util="http://schemas.microsoft.com/wix/UtilExtension" 属性的引用。

  2. Product 元素中定义 <Property Id="Dll_Installed" Value="false"/>

  3. 将 child <Condition>NOT Dll_Installed</Condition> 添加到组件 myLib.dll

  4. 在您的代码中的某处添加:

     <Fragment>
     <util:FileSearch
               Id="Dll_Installed"
               Variable="Dll_Installed"
               Path="[Shared_Dir]myLib.dll"
               Result="exists"/>
     </Fragment>
    

DefaultVersion 属性不是必需的。

您描述的功能是引用计数。 Windows 安装程序对组件的引用计数。组件由其 GUID 标识。

所以解决这个需求的正常方法是将文件放在一个组件中,并确保组件的GUID是稳定的。如果您没有指定 Component/@Guid 属性,WiX 工具集应该会自动执行此操作。

所以默认行为应该适合您。

唯一的另一块拼图是 Windows 安装程序将安装最新版本的文件。如果文件版本相同或更低,文件将不会安装,但会被引用计数。

根据问题中的详细信息,您似乎应该没问题:

<Component Directory="Shared_Dir">
 <File Source="mySource\myLib.dll" />
</Component>

有人可能会问为什么 Windows 安装程序使用组件来引用计数文件。我们会,它允许您将其他资源(如注册表项)分组在一起,并作为一个单元控制它们的安装。如果您正在安装 COM 服务器,则比普通的旧文件重要得多。