アンインストール中にインストーラーがレジストリ キーを削除するか保持するかをユーザーが指定できるようにする必要があります。これが私がすることです。次のような Condition 要素を持つ RemoveRegistryKey コンポーネントがあります。
<Component
Id="ID"
Guid="GUID"
KeyPath="yes" >
<Condition></Condition>
<RemoveRegistryKey
Root="HKLM"
Key="Software\PATH_TO_KEY"
Action="removeOnUninstall"/>
</Component>
これは期待どおりに動作するようです。Condition 要素を0にハード コードすると、レジストリ キーは残ります。1に設定すると、レジストリ キーは削除されます。(このレジストリ キーを作成する別のコンポーネントがありますが、私はそのForceDeleteOnUninstall属性をnoに設定しました。)
ここで、アンインストール中にユーザー入力を介してこの状態を制御する必要があります。次のような C# の CA があります。
[CustomAction]
public static ActionResult AskUser(Session session)
{
MessageResult result = session.Message
(
InstallMessage.User +
(int)MessageBoxIcon.Information +
(int)MessageBoxButtons.YesNo,
new Record { FormatString = String.Format("Delete registry key?") }
);
if (result == MessageResult.Yes)
session["DELETEREGKEY"] = "1";
return ActionResult.Success;
}
次のコードを使用して CA の実行をスケジュールします。
<CustomAction Id="AskUserCA" BinaryKey="CA_Dll" DllEntry="AskUser" Execute="immediate" />
<InstallExecuteSequence>
<Custom Action="AskUserCA" Before="InstallValidate">(REMOVE="ALL") AND (NOT UPGRADINGPRODUCTCODE)</Custom>
</InstallExecuteSequence>
そして、RemoveRegistryKey コンポーネントの Condition 要素を次のように設定します。
<Condition>DELETEREGKEY="1"</Condition>
DELETEREGKEY=1 と DELETEREGKEY も試しましたが、CA からプロンプトが表示され (アンインストールの確認ダイアログ ボックスの後に表示されます)、DELETEREGKEY が 1 に設定されていることがログ ファイル (ログを使用している場合) で確認できますが、応答 (はいまたはいいえ) に関係なく、レジストリ キーは削除されません。他のイベントの前後に CA をスケジュールしようとしましたが、何も役に立たないようです。
この条件が常に false と評価されるように見えるのはなぜですか? それを機能させる方法はありますか?
また、より良い代替手段はありますか?アンインストール ダイアログを変更して、ユーザーにレジストリ キーの削除を促すチェック ボックスを追加することを考えていましたが、その方法がわかりません。インストール シーケンスに変更を加える方法 (既存のダイアログを変更するか、新しいダイアログを追加する方法) は知っていますが (変更された WixUI_InstallDir シーケンスを使用しています)、アンインストール時にそれを行う方法がわかりません。
何か案は?