5

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 タスクが表示されたままになります。また、次のエラー メッセージが表示されました。

エラーメッセージ #1

だからこそ、私はこれを試しました:

<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" />

これは私に別のエラーを与えました:

エラー #2、ここで何が間違っていますか?

ただ死ぬことを拒否するこのプロセスに敬意を表して像を建てることを考えています!!! ...それか、Application.Exit(); のようなものを追加する必要があるアプリケーション側に問題があると思います。または Environment.Exit(0); Program.cs 内のある行で。

アンインストール時に Wix またはアプリケーションを正常に終了するために、Wix またはアプリケーションで他にできることはありますか? ありがとう!

4

1 に答える 1

3

個人的にはCloseApplication、以前のオプションではなく、組み込みの方法を使用するのが最善の方法だと思います。

そのために発生しているエラー (エラー コード 2762) は、即時シーケンスでアクションをスケジュールしようとしているが、ElevatedCloseMessage="yes"それを遅延アクションとしてトリガーするセットがあるためです。この属性を削除するか、遅延シーケンスでスケジュールしてください。

于 2013-05-14T11:19:54.830 に答える