我正在使用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
没有帮助,因为它在删除注册表项之前运行 - 所以它总是会发现键/值仍然完整。
如何确定当前的卸载是否正在删除最后一个实例?