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
すべてが再び機能します。CommitCA
InstallCA
カスタムアクションの戻り値について、私が誤解しているものがあるかもしれません。ActionResult.Failure
この状態で帰らなくてもいいのでしょうか? しかし、実際にはActionResult.Failure
他の場所にも戻ってきます。実際、CommitCA
関数自体では、同じ構造を使用しActionResult.Failure
ました:Catch
ブロックで戻ります。それで、誰かが私が間違ったことを教えてもらえますか?