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
しても役に立ちません。そのため、キー/値は常にそのままであることがわかります。
現在のアンインストールが最後のインスタンスを削除しているかどうかを確認するにはどうすればよいですか?