web-dev-qa-db-ja.com

WIXカスタムアクションのデバッグが機能しない

カスタムアクションをデバッグしようとしました。 Debugger.Break()をカスタムアクションcsに入れました。カスタムアクションを作成すると、次のファイルが作成されます。

myCustomAction.dll
myCustomAction.CA.dll
myCustomAction.pdb

Wixプロジェクトでは、バイナリタグ内のmyCustomAction.CA.dllを参照します(myCustomAction.dllではありません)。 myCustomAction.CA.pdbが存在しないので、これがデバッグが機能しない理由ですか?メッセージボックスが表示されたら、メッセージボックスとプロセスへのアタッチも試しました。しかし、次のメッセージが表示されます。PDBファイルが見つからないか開くことができません。

私が間違っているのは何ですか?私はwix3.5バージョンとビジュアルスタジオ2010を持っています。

23
Simon

これが 記事 私を助けてくれました。

カスタムアクションの最初の行に次のコードを追加するだけです。

System.Diagnostics.Debugger.Launch();

次に、インストーラーを実行します。アクションの実行を開始すると、ポップアップウィンドウが表示され、デバッグ用のVisualStudioを起動するよう提案されます。

参照ライブラリは正しいです。*。CA.dllである必要があります。また、MessageBoxを使用したアプローチも機能しますが、rundll32プロセスにアタッチする必要があります。

58
vortexwolf

DTFカスタムアクションでは、2つの手法は次のとおりです。

1)カスタムアクションにMessageBoxを配置し、そのプロセスにVisualStudioをアタッチします。アタッチするときは、ネイティブおよびCLRがロードされたrundll32プロセスを探します。

2)MsiBreak環境変数をエントリポイントの名前に設定し、マシンを再起動します。 DTFは、そのカスタムアクションが呼び出されると、デバッガーを呼び出します。

それ以外の場合、私の一般的な提案は、エントリポイントを、再利用可能なクラスをMSIに接続する非常に薄いベニヤにすることです。通常、スタンドアロンクラスを作成して、コンソールアプリでデータをフィードし、すべてをテストしてから、そのクラスをDTFに接続します。インストーラーのカスタムアクションをデバッグする必要はほとんどありません。

そうでなければ、私は一般的にこれが機能することを知っています。

5

あなたの側の問題が何であるかはわかりませんが、ここにサンプルのカスタムアクションとそれをデバッグする方法の記事があります。次の記事で説明されているように機能するはずです: http://www.advancedinstaller.com/user-guide/qa-c-sharp-ca.html

3
Bogdan Mitrache

これはの使用に加えてです

System.Diagnostics.Debugger.Launch();

VMなどのリモートシステムでのデバッグを改善する方法。 .CA.dllのパッケージ化に使用されるwixターゲットファイルにいくつかの変更を加えましたが、良好な結果が得られました。

最初のアイテムの作成の条件で、%(ReferenceCopyLocalPaths.extension) '==' .pdb 'のチェックを追加しました。これにより、依存関係.pdbのほとんどが.CA.dllに含まれるようになり、でのデバッグが容易になります。リモートシステム。

C:\ Program Files(x86)\ MSBuild\Microsoft\WiX\v3.x\wix.ca.targets

<Target Name="PackCustomAction"
   Inputs="@(IntermediateAssembly);@(Content);$(CustomActionContents)"
   Outputs="$(IntermediateOutputPath)$(TargetCAFileName)">

    <!-- Find all referenced items marked CopyLocal, but exclude non-binary files. -->
    <CreateItem
     Include="@(ReferenceCopyLocalPaths)"
     Condition=" '%(ReferenceCopyLocalPaths.extension)' == '.pdb' or '%(ReferenceCopyLocalPaths.extension)' == '.dll' or '%(ReferenceCopyLocalPaths.extension)' == '.exe'">
      <Output TaskParameter="Include" ItemName="CustomActionReferenceContents"/>
    </CreateItem>
1
Syll