WIXを使用してアプリケーションをインストールするプロジェクトに取り組んでいます。要件の1つは、現在のバージョンをインストールする前に古いバージョンを削除することです。古いバージョンはMSIベースではなく、SetupApi(infファイルに依存)で作成されています。
これはカスタムアクションで実現できると思いました。ロジックは次のとおりです。
- HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \%NAME%で「古代」バージョンを探し、可能であればUninstallString値を抽出します
- 値が設定されている場合は、そのコマンドを実行するカスタムアクションを実行します。通常は、RunDll32 advpack.dll、LaunchINFSection C:\ PROGRA〜1 \ PROGRAM \ file.inf、DefaultUninstallのような文字列です。
- このアクションは、共有ファイルとレジストリキーを持っているため、プログラムをインストールする前に実行する必要があります。MSIのインストールの最後にカスタムアクションを実行すると、プログラムが中断します
私の質問は次のとおりです。
- これは、古いINFベースのプログラムを削除するための推奨される方法ですか?
INFベースのプログラムをサイレントにアンインストールする方法はありますか?そうしないと、ユーザーエクスペリエンスがかなり悪くなります。ある人がプログラムをインストールしていると、突然「プログラムのアンインストール」ウィンドウが表示されます。これは直感に反します。[アンインストールコマンドに「、3」を追加することで解決しました]
興味のある方のために、上記で説明したことを実行するコードスニペットを次に示します。
<Property Id="ANCIENTVERSION">
<RegistrySearch Id="RegistrySearchAncientVersion" Type="raw"
Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Program"
Name="UninstallString" />
</Property>
<CustomAction Id="removeAncientVersion"
Directory="SystemFolder"
<!--ExeCommand="[ANCIENTVERSION]" regular uninstall-->
ExeCommand="[ANCIENTVERSION],3" <!--silent uninstall-->
Execute="immediate"
Return="check"/>
<InstallExecuteSequence>
<Custom Action='removeAncientVersion' After='InstallValidate'>ANCIENTVERSION</Custom>
</InstallExecuteSequence>