2013-03-14 14 views
16

カスタムアクションをデバッグしようとしました。 Debugger.Break()をカスタムアクションcsに配置しました。私はカスタムアクションを構築するとき それは、このファイルを作成します。WIXカスタムアクションのデバッグが機能しない

WiXのプロジェクトで
myCustomAction.dll 
myCustomAction.CA.dll 
myCustomAction.pdb 

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

私は間違っていますか?私はWix 3.5バージョンとVisual Studio 2010を持っています。

+0

これは見ましたか? http://stackoverflow.com/questions/2566977/no-debug-info-in-wix-managed-custom-action-using-visual-studio-integration –

+0

C#カスタムアクションプロジェクトのプロジェクトを作成しました。 他の設定はありますか? – Simon

答えて

2

あなたの問題は何か分かりませんが、サンプルのカスタムアクションとそれをデバッグする方法の記事があります。次の記事で説明したように、それは動作するはずです:二つの技術があるDTFカスタムアクションでhttp://www.advancedinstaller.com/user-guide/qa-c-sharp-ca.html

3

1)あなたのカスタムアクションでメッセージボックスを配置し、そのプロセスにVisual Studioのを添付する。接続するときは、ネイティブとCLRがロードされた状態でrundll32プロセスを探します。

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

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

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

+0

カスタムアクションが私が作成したマージモジュールの一部である場合、MMSIBREAK環境変数が機能するかどうか知っていますか? –

+0

私はメモリで完全な解決策を思い出すことはできませんでした。ここではいくつかのハイライトがあります:MMSIBREAKがDLLのCustomAction名またはEntrypoint名を使用するかどうかはわかりません。カスタムアクション名がマージモジュールとの唯一の違いは、名前がモジュール化されていることです(NameではなくName.GUID)。エントリポイント名の場合、モジュール化されていないので違いはありません。 –

+0

カスタムアクションがシステムコンテキストで実行されている偽装のない遅延実行で実行されている場合に、MSIが認識する環境変数を取得する前にマシンを再起動する必要があります。これは、Windowsでのサービスコントロールマネージャの動作です。 –

43

私は助けてくれたthe articleです。

ちょうどあなたのカスタムアクションの最初の行に次のコードを追加します。

System.Diagnostics.Debugger.Launch(); 

は、それからちょうどインストーラを実行します。あなたのアクションの実行を開始すると、ポップアップウィンドウが表示され、デバッグ用のビジュアルスタジオを起動する提案が表示されます。

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

+2

これは正しい回答としてマークする必要があります。 –

+1

[documentation](http://msdn.microsoft.com/en-us/library/aa368322%28VS.85%29.aspx)にあるように、 'MsiProcessMessage'(session.Logの背後にあるAPI)は、 ControlEventから使用することができます。これはあなたのメッセージがあなたのログに現れないようにします。私はしばらく頭を傷つけていました! –

+0

私が探していたもの!ありがとう! –

0

これは、VMのようなリモートシステムのデバッグを改善するように

System.Diagnostics.Debugger.Launch(); 

の使用に加えています。 .CA.dllをパッケージ化するために使用されたwixターゲットファイルに変更を加えました。最初、私は %のチェックを追加した項目(ReferenceCopyLocalPaths.extension)を作成「==」の.pdb」の条件 で

今、私の.CA.dllイム含まれている私の依存関係のほとんどの.pdbその方法とリモートシステムでのデバッグの経験が容易になります。

C:¥Program Files(x86)¥MSBuild¥Microsoft¥WiX¥v3.x¥wix.ca。ターゲット

<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> 
関連する問題