2

我正在使用 WiX 为我的产品创建多实例 MSI。

MultiInstance="yes"属性解决了在多实例环境中管理所有支持的资源(如文件、注册表值、Windows 服务等)的问题。

但是,我不知道如何使用非内置类型的资源(如证书)来解决同样的问题。在每个实例上创建单独的证书没有问题安装并在每个实例上删除它卸载...

但是,如果我需要共享证书怎么办?这意味着第一个安装的实例将创建它,最后一个删除的实例将删除它(相当于带有 的组件MultiInstance="no"

我正在使用此处描述的方法为我的 MSI 实现多个实例:

http://ysdevlog.blogspot.co.il/2011/08/revisited-multiple-instance.html

简而言之,每个实例都在预定义的注册表位置“注册”自身,因此我可以知道当前安装的实例:

<Component Id="RegistryComponent" Guid="{GUIDGOES-HERE-45e5-ABFD-07E5CC4D7BC9}" MultiInstance="yes">
      <RegistryKey Id="MainRegKey" Action="createAndRemoveOnUninstall" Root="HKLM" Key="SOFTWARE\MultiInstanceTest\[ProductCode]">
         <RegistryValue Id="MainRegValue" Name="InstanceId" Value="[INSTANCEID]" Type="string" />
         <RegistryValue Id="InstallPathValue" Name="Location" Value="[ProductNameFolder]" Type="string" />
         <RegistryValue Id="ProductCodeValue" Name="ProductCode" Value="[ProductCode]" Type="string" />
         <RegistryValue Id="ProductNameValue" Name="ProductName" Value="[ProductName]" Type="string" />
         <RegistryValue Id="ProductVersionValue" Name="ProductVersion" Value="[ProductVersion]" Type="string" />
      </RegistryKey>
   </Component>

这有助于我使用一个小型外部程序管理实例的安装和删除,该程序基本上读取此注册表位置并发出msiexec命令。

我需要能够确定它是否是最后一个实例才能删除任何自定义共享资源(例如证书)。使用RegistrySearch没有帮助,因为它在注册表项被删除之前运行 - 所以它总是会发现键/值仍然完好无损。

如何确定当前卸载是否正在删除最后一个实例?

4

0 回答 0