Wix で作成された MSI からアンインストールを実行する場合、ファイルを削除する前に、バックグラウンドで実行されているプロセスを強制的に強制終了する必要があります。主なアプリケーションは、ローカル Windows サービスを監視している bg-process のステータスを反映するトレイアイコンで構成されています (C# で作成されていますが、これはあまり関連性がないかもしれません)。
私は最初に次のことを試しました:
<File Id='FooEXE' Name='Foo.exe' Source='..\Source\bin\Release\Foo.exe' Vital='yes' />
...
<InstallExecuteSequence>
<Custom Action="CloseTray" Before="InstallValidate" />
</InstallExecuteSequence>
...
<CustomAction Id="CloseTray" ExeCommand="-exit" FileKey="FooEXE" Execute="immediate" Return="asyncWait" />
アプリケーションを閉じるダイアログを確認すると、トレイ アイコンはすぐに閉じられますが、アンインストールが完了した後も、タスク マネージャーに Foo.Exe タスクが表示されたままになります。また、次のエラー メッセージが表示されました。
だからこそ、私はこれを試しました:
<InstallExecuteSequence>
<Custom Action="Foo.TaskKill" Before="InstallValidate" />
</InstallExecuteSequence>
...
<CustomAction Id="Foo.TaskKill" Impersonate="yes" Return="asyncWait" Directory="WinDir" ExeCommand="\System32\taskkill.exe /F /IM Foo.exe /T" />
同じ結果を得た後、試しました:
<Property Id="QtExecCmdLine" Value='"[WinDir]\System32\taskkill.exe" /F /IM Foo.exe'/>
...
<InstallExecuteSequence>
<Custom Action="MyProcess.TaskKill" Before="InstallValidate" />
</InstallExecuteSequence>
...
<CustomAction Id="MyProcess.TaskKill" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="ignore"/>
ここから取ったサンプル: WiX からプロセスを強制終了する方法
最近、他のすべてが失敗したとき、私もこれを試しましたが成功しませんでした:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
...
<InstallExecuteSequence>
<Custom Action="WixCloseApplications" Before="InstallValidate" />
</InstallExecuteSequence>
...
<util:CloseApplication Id="CloseFoo" CloseMessage="yes" Description="Foo is still running!" ElevatedCloseMessage="yes" RebootPrompt="yes" Target="Foo.exe" />
これは私に別のエラーを与えました:
ただ死ぬことを拒否するこのプロセスに敬意を表して像を建てることを考えています!!! ...それか、Application.Exit(); のようなものを追加する必要があるアプリケーション側に問題があると思います。または Environment.Exit(0); Program.cs 内のある行で。
アンインストール時に Wix またはアプリケーションを正常に終了するために、Wix またはアプリケーションで他にできることはありますか? ありがとう!