35

C#スクリプトを実行し、DLLファイル(私のクラスライブラリ)を操作できる外部ワークフローがあります。

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

ありがとう

4

5 に答える 5

34

はい、これはVisualStudioで実行できます。2つのオプションがあります。

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

  1. DLLプロジェクトを開きます。

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

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

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

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

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

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

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

既存のプロセスに添付する

プロセスを開始できないが、代わりにすでに実行中のプロセスに接続する必要がある場合は、それも実行できます。

(補足:Visual Studioの「Express」エディションを使用している場合、この機能はないと思いますが、それについてはよくわかりません。簡単にわかります。どちらのメニューもあります。以下のステップ4に記載されている項目かどうか。)

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

  2. DLLプロジェクトを開きます。

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

  4. [デバッグ]メニューから、[プロセスにアタッチ... ]を選択します。

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

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

  7. 外部プロセスをロードしてコードを実行するために行うことは何でもします。

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


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

于 2012-12-06T11:16:01.323 に答える
3

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のバージョンによって異なります。

于 2013-03-07T16:45:59.087 に答える
3

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

于 2018-04-12T11:22:33.123 に答える
2

Microsoftからの便利なリンク:マネージDLLプロジェクトで呼び出し元のアプリを指定する

  1. クラスライブラリプロジェクトを開く
  2. [プロジェクト]に移動します
  3. 下部でプロジェクトの[プロパティ...]を選択します
  4. [デバッグ]に移動します
  5. [起動]行で、[実行可能ファイル]を選択します
  6. .exeファイルへのパスを選択します
  7. ブレークポイントを設定する
  8. プロジェクトを実行します。

Microsoftからのリンクには、他にもさまざまな便利なデバッグシナリオがあります。

VisualStudio16.4.5を使用しています。

于 2020-03-16T11:17:08.653 に答える
-2

最近では、ライブラリコードを実行するための単体テストプロジェクトを作成する方が現実的だと思います。したがって、1つの石で2羽の鳥を殺します。同じソリューションでプロジェクトをデバッグし、テストでコードをカバーし始めることができます。

于 2017-07-26T12:39:49.240 に答える