WIX を使用して Windows インストーラー プロジェクトを設計しています。コミット カスタム アクションが実行されないため、インストールに失敗します。これは、奇妙なことに、スケジュールされた次のカスタム アクションに戻るルートが 1 つあるためActionResult.Successです。詳細を説明しましょう:
基本的に、インストールに関して 2 つのカスタム アクションがあります。1 つは CommitCA と呼ばれ、もう 1 つは InstallCA と呼ばれます。実行スケジュールは次のとおりです。
<CustomAction Id="CommitCA" BinaryKey="CustomActionDll" DllEntry="CommitCA" Execute="commit" Return="check" Impersonate="no"/>
<CustomAction Id="InstallCA" BinaryKey="CustomActionDll" DllEntry="InstallCA" Execute="deferred" Return="check" Impersonate="no"/>
コンパイルされたインストーラーで、InstallCA の前に CommitCA がスケジュールされていることを ORCA から確認しました。CommitCA のタイプは 3585 で、InstallCA は 3703 です (それらへの参照は見つかりませんが、1 つはコミット アクション用で、もう 1 つは私が宣言した遅延アクション用であると想定しています)。アイデアは、InstallCA によって使用されるいくつかのファイルを生成する CommitCA にあります。
私の構造はInstallCA次のようになります。
Try
' Do some work
...
Catch ex As Exception
' Log the failure into installation log
Return ActionResult.Failure
End Try
Return ActionResult.Success
ActionResult.Failureここで紛らわしい部分があります。もともと、Catchブロックに戻る行がなかった作業バージョンがあります。つまり、関数は引き続き失敗をログに記録しますがSuccess、例外がスローされた場合でも最終的に戻ります。例外が発生してログを確認すると、カスタム アクションが成功したと表示されることがあるからです。そのため、行を追加しました
Return ActionResult.Failure
しかし、今ではもう機能しません!CommitCAインストールするたびに、決して実行されないことがわかります。注:InstallCA私が行った唯一のコード変更を含む ではなく、 のCommitCA前に実際にスケジュールされているInstallCAです。そして、「決して実行されない」と言うとき、関数呼び出し内に置いたログエントリが見つからず、MMSIBREAK環境変数もまったく機能しないことを意味します (rundll32 プロセスにアタッチするように通知するウィンドウは決して実行されません)浮き出る)。しかし、以下InstallCAはまだ実行されます。
の行をコメントアウトすると、Return ActionResult.Failureすべてが再び機能します。CommitCAInstallCA
カスタムアクションの戻り値について、私が誤解しているものがあるかもしれません。ActionResult.Failureこの状態で帰らなくてもいいのでしょうか? しかし、実際にはActionResult.Failure他の場所にも戻ってきます。実際、CommitCA関数自体では、同じ構造を使用しActionResult.Failureました:Catchブロックで戻ります。それで、誰かが私が間違ったことを教えてもらえますか?