C#スクリプトを実行し、DLLファイル(私のクラスライブラリ)を操作できる外部ワークフローがあります。
クラスライブラリプロジェクトにデバッグをアタッチして、このWFが呼び出すとブレークポイントがヒットするようにすることはできますか?
ありがとう
C#スクリプトを実行し、DLLファイル(私のクラスライブラリ)を操作できる外部ワークフローがあります。
クラスライブラリプロジェクトにデバッグをアタッチして、このWFが呼び出すとブレークポイントがヒットするようにすることはできますか?
ありがとう
はい、これはVisualStudioで実行できます。2つのオプションがあります。
DLLプロジェクトを開きます。
プロジェクトのプロパティで、 [デバッグ]タブに移動します。
[外部プログラムの開始]を選択し、DLLを呼び出す外部プログラムのパス、指定する必要のあるコマンドライン引数、および関連する場合は作業ディレクトリを指定します。
プロジェクトを保存します。
コード内の必要な場所にブレークポイントを設定します。
F5キーを押してデバッグを開始します。(この時点で、シンボルがロードされていないため、ブレークポイントはヒットしないと表示されます。今のところは気にしないでください。)
外部アプリケーションにライブラリをロードさせてコードを実行させるために行うことは何でもします。
Visual Studioは、モジュールの読み込みを検出し、シンボルを読み込み、ブレークポイントで停止します。
プロセスを開始できないが、代わりにすでに実行中のプロセスに接続する必要がある場合は、それも実行できます。
(補足:Visual Studioの「Express」エディションを使用している場合、この機能はないと思いますが、それについてはよくわかりません。簡単にわかります。どちらのメニューもあります。以下のステップ4に記載されている項目かどうか。)
プロセスが実行されていることを確認してください。
DLLプロジェクトを開きます。
ブレークポイントなどを設定します。
[デバッグ]メニューから、[プロセスにアタッチ... ]を選択します。
表示されるダイアログボックスで、リストからプロセスを見つけて強調表示し、[添付]をクリックします。
VisualStudioはデバッグモードになります。(この時点で、シンボルがロードされていないため、ブレークポイントはヒットしないと表示されます。今のところは気にしないでください。)
外部プロセスをロードしてコードを実行するために行うことは何でもします。
Visual Studioは、外部プロセスでモジュールの読み込みを検出し、シンボルを読み込み、ブレークポイントで停止します。
注意:どちらの場合も、外部プロセスがプロジェクトのフォルダ以外の場所からDLLをロードする場合は、ビルドするたびbin/Debug
にDLLを別の場所にコピーする必要があります(これは、で自動的に行われるように設定できます)。プロジェクトオプション)。そうしないと、Visual Studioは、ロードされているDLLがデバッグしようとしているDLLであることを検出できません。
DLLプロジェクトをデバッグするために、[デバッグ]メニューから[アタッチして処理]を使用できます。ネイティブコードでデバッグが行われない場合は、混合モードのデバッグを使用する必要がある場合があります。これは、[プロセスにアタッチ]ウィンドウ内の[選択]ボタンをクリックしたときに表示されるウィンドウから[管理対象およびネイティブのコードタイプ]を選択することで実行できます。
使用しているVisualStudioのエディションがマクロをサポートしている場合は、次のコードを使用して新しいマクロを作成し、これをすべて自動化できます。
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は、[プロセスにアタッチ]ウィンドウから取得できます。また、マネージコードのバージョン(この場合は「マネージ(v4.0)」)は、使用する.NETFrameworkのバージョンによって異なります。
外部アプリが必要ない/使用できない場合は、Visual Studioから直接クラスライブラリを呼び出すことができます。未亡人Ctrl+Alt+I
を表示"Immediate"
するには、そこからクラスライブラリから任意のメソッドを呼び出すことができます(ブレークポイントを使用)。完全修飾名(つまり、名前空間)を入力する必要があります。
Microsoftからの便利なリンク:マネージDLLプロジェクトで呼び出し元のアプリを指定する
Microsoftからのリンクには、他にもさまざまな便利なデバッグシナリオがあります。
VisualStudio16.4.5を使用しています。
最近では、ライブラリコードを実行するための単体テストプロジェクトを作成する方が現実的だと思います。したがって、1つの石で2羽の鳥を殺します。同じソリューションでプロジェクトをデバッグし、テストでコードをカバーし始めることができます。