web-dev-qa-db-ja.com

外部アプリから呼び出されたクラスライブラリをデバッグする方法

C#スクリプトを実行し、DLL files(my class library))を操作できる外部ワークフローがあります。

デバッグをクラスライブラリプロジェクトにアタッチして、ブレークポイントがヒットすると、このWFが呼び出しますか?

ありがとう

24
Sergejs

はい、Visual Studioでこれを行うことができます。次の2つのオプションがあります。

外部プログラムを開始するようにプロジェクトを構成します

  1. DLLプロジェクト。

  2. プロジェクトのプロパティで、デバッグタブに移動します。

  3. 外部プログラムの起動を選択し、DLLを呼び出す外部プログラムのパスと、必要なコマンドライン引数、および関連する場合は作業ディレクトリを指定します。

  4. プロジェクトを保存します。

  5. コード内の必要な場所にブレークポイントを設定します。

  6. F5を押してデバッグを開始します。 (この時点で、ブレークポイントは、シンボルがロードされていないためヒットしないと言うでしょう。今のところは心配しないでください。)

  7. 外部アプリケーションにライブラリをロードさせ、コードを実行させるためにあなたがすることは何でもしてください。

Visual Studioはモジュールのロードを検出し、シンボルをロードして、ブレークポイントで停止します。

既存のプロセスにアタッチします

プロセスを開始できないが、すでに実行中のプロセスにアタッチする必要がある場合は、それも実行できます。

(サイドノート:Visual Studioの「Express」エディションを使用している場合、私は思考この機能はありませんが、確信はありません次のステップ4に記載されているメニュー項目があるかどうかがわかります。)

  1. プロセスが実行されていることを確認してください。

  2. DLLプロジェクト。

  3. ブレークポイントなどを設定します。

  4. デバッグメニューから、プロセスに接続...を選択します

  5. 表示されるダイアログボックスで、リストでプロセスを見つけて強調表示し、Attachをクリックします。

  6. Visual Studioはデバッグモードになります。 (この時点で、ブレークポイントは、シンボルがロードされていないためヒットしないと言うでしょう。今のところは心配しないでください。)

  7. 外部プロセスにコードをロードして実行させるために、何でもします。

Visual Studioは、外部プロセスでのモジュールのロードを検出し、シンボルをロードして、ブレークポイントで停止します。


NBどちらの場合でも、外部プロセスがプロジェクトのbin/Debugフォルダー以外の場所からDLL)をロードする場合、必ずコピーする必要がありますDLL他の場所にビルドするたびに(プロジェクトオプションで自動的に発生するように設定できます)それ以外の場合、Visual Studioは、ロードされているDLLがデバッグしようとしているものであることを検出できません。

27
T.J. Crowder

DLLプロジェクトをデバッグするためにDebugメニューからプロセスにアタッチを使用できます。デバッグはネイティブコードでは発生しません。これは、クリックしたときに表示されるウィンドウからManaged and Nativeコードタイプを選択することで実行できますSelectボタンAttach to processウィンドウ内にあります。

使用しているVisual Studioのエディションがマクロをサポートしている場合、次のコードを使用して新しいマクロを作成し、これをすべて自動化できます。

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module AttachToProcess

    Public Sub DebugMyDLL()
        DTE.ExecuteCommand("Build.BuildSelection")
        Dim ApplicationExePath As String = "C:\Program Files (x86)\foo\bar.exe"
        Shell(ApplicationExePath)
        Try
            Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
            Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
            Dim dbgeng(2) As EnvDTE80.Engine
            dbgeng(0) = trans.Engines.Item("Managed (v4.0)")
            dbgeng(1) = trans.Engines.Item("Native")
            Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "<QualifierName>").Item("bar.exe")
            proc2.Attach2(dbgeng)
        Catch ex As System.Exception
            MsgBox(ex.Message)
        End Try
    End Sub

End Module

上記のマクロは、プロジェクトのビルドを試み、外部アプリケーションを起動して、DLL=そのプログラムに自動的にアタッチします。QualifierNameプロセスへのアタッチウィンドウからのシステム用。また、マネージコードのバージョン( "Managed(v4.0)" inこの場合)は、使用する.NETフレームワークのバージョンによって異なります。

2
Manas Jog

外部アプリを使いたくない/使用できない場合-Visual Studioから直接クラスライブラリを呼び出すことができます:Ctrl+Alt+Iを表示"Immediate"未亡人、その後、そこからクラスライブラリからメソッドを呼び出すことができます(ブレークポイントを使用)。完全修飾名(つまり、名前空間)を入力する必要があります。

1
alexkovelsky