Visual Studio で DLL をデバッグする (C#、C++、Visual Basic、F#)

DLL (ダイナミック リンク ライブラリ) は、複数のアプリで使用できるコードとデータが含まれているライブラリです。 Visual Studio を使用して、DLL の作成、ビルド、構成、デバッグを行うことができます。

DLL を作成する

次の Visual Studio プロジェクト テンプレートでは、DLL を作成できます。

  • C#、Visual Basic、または F# のクラス ライブラリ
  • C# または Visual Basic の Windows フォーム コントロール (WCF) ライブラリ
  • C++ のダイナミック リンク ライブラリ (DLL)

詳細については、「MFC のデバッグ技術」を参照してください。

WCF ライブラリのデバッグは、クラス ライブラリのデバッグと似ています。 詳細については、「Windows フォーム コントロール」を参照してください。

通常は、別のプロジェクトから DLL を呼び出します。 呼び出し元のプロジェクトをデバッグするとき、DLL の構成によっては、DLL のコードにステップ インしてデバッグすることができます。

DLL のデバッグ構成

Visual Studio のプロジェクト テンプレートを使用してアプリを作成すると、デバッグ ビルドとリリース ビルドの構成に必要な設定は、Visual Studio によって自動的に作成されます。 これらの設定は必要に応じて変更できます。 詳細については、次の記事を参照してください。

C++ の DebuggableAttribute を設定する

C++ DLL にデバッガーをアタッチするには、C++ のコードで DebuggableAttribute を生成する必要があります。

DebuggableAttribute を設定するには:

  1. ソリューション エクスプローラーで C++ DLL プロジェクトを選択し、[プロパティ] アイコンを選択するか、プロジェクトを右クリックして [プロパティ] を選択します。

  2. [プロパティ] ペインの [リンカー]>[デバッグ] で、[デバッグできるアセンブリ] に対して [はい (/ASSEMBLYDEBUG)] を選択します。

詳細については、「/ASSEMBLYDEBUG」を参照してください。

C/C++ DLL のファイルの場所を設定する

外部 DLL をデバッグするには、呼び出し元のプロジェクトで、DLL、その .pdb ファイル、および DLL で必要な他のファイルを見つけることができる必要があります。 カスタム ビルド タスクを作成して、これらのファイルを <プロジェクト フォルダー>\Debug 出力フォルダーにコピーするか、ファイルを手動でここにコピーすることができます。

C/C++ プロジェクトの場合は、出力フォルダーにコピーするのではなく、プロジェクトのプロパティ ページでヘッダーと LIB ファイルの場所を設定できます。

C/C++ のヘッダー ファイルと LIB ファイルの場所を設定するには:

  1. ソリューション エクスプローラーで C/C++ DLL プロジェクトを選択し、[プロパティ] アイコンを選択するか、プロジェクトを右クリックして [プロパティ] を選択します。

  2. [プロパティ] ペインの上部にある [構成] で、[すべての構成] を選択します。

  3. [C/C++]>[全般]>[追加のインクルード ディレクトリ] で、ヘッダー ファイルのフォルダーを指定します。

  4. [リンカー]>[全般]>[追加のライブラリ ディレクトリ] で、LIB ファイルのフォルダーを指定します。

  5. [リンカー]>[入力]>[追加の依存ファイル ] で、LIB ファイルの完全なパスとファイル名を指定します。

  6. [OK] を選択します。

C++ プロジェクトの設定の詳細については、Windows C++ のプロパティ ページのリファレンスに関するページを参照してください。

デバッグ バージョンをビルドする

デバッグを始める前に、必ず DLL のデバッグ バージョンをビルドしてください。 DLL をデバッグするには、呼び出し元のアプリで、その .pdb ファイルおよび DLL で必要な他のファイルを見つけることができる必要があります。

カスタム ビルド タスクを作成して、DLL ファイルを <呼び出し元プロジェクト フォルダー>\Debug 出力フォルダーにコピーするか、ファイルを手動でここにコピーすることができます。

正しい場所の DLL を呼び出していることを確認します。 これは明白なことのように見えるかもしれませんが、呼び出し元のアプリで DLL の別のコピーを検出して読み込んだ場合、設定したブレークポイントにデバッガーがヒットすることはありません。

DLL をデバッグする

DLL を直接実行することはできません。 アプリ (通常は .exe ファイル) で呼び出す必要があります。 詳細については、「Visual Studio のプロジェクト - C++」を参照してください。

DLL をデバッグするには、呼び出し元のアプリからデバッグを開始するか、呼び出し元のアプリを指定することにより DLL プロジェクトからデバッグすることができます。 また、デバッガーの [イミディエイト] ウィンドウを使用して、呼び出し元アプリを使用せずに、デザイン時に DLL の関数やメソッドを評価することもできます。

詳細については、「デバッガーでのはじめに」を参照してください。

呼び出し元アプリからデバッグを開始する

DLL を呼び出すことができるアプリは次のとおりです。

  • DLL と同じまたは別のソリューション内の Visual Studio プロジェクトのアプリ。
  • テスト コンピューターや運用コンピューターに既に配置されて実行されている既存のアプリ。
  • Web に配置され、URL からアクセスするアプリケーション。
  • DLL が埋め込まれている Web ページを含む Web アプリ。

呼び出し元アプリから DLL をデバッグするには、次のようにします。

  • 呼び出し元アプリのプロジェクトを開き、[デバッグ]>[デバッグの開始] を選択するか、F5 キーを押して、デバッグを開始します。

    or

  • テスト コンピューターまたは運用コンピューターに既に配置されて実行されている既存のアプリにアタッチします。 Web サイト上または Web アプリ内の DLL に対しては、この方法を使用します。 詳細については、「方法: 実行中のプロセスにアタッチする」を参照してください。

呼び出し元アプリのデバッグを始める前に、DLL 内にブレークポイントを設定します。 ブレークポイントの使用に関するページを参照してください。 DLL のブレークポイントにヒットしたら、コードをステップ実行して、1 行ずつアクションを確認できます。 詳細については、デバッガーでのコード間の移動に関するページを参照してください。

デバッグ中に、[モジュール] ウィンドウを使用して、アプリで読み込まれる DLL と .exe ファイルを確認できます。 [モジュール] ウィンドウを開くには、デバッグ中に、[デバッグ]>[ウィンドウ]>[モジュール] を選択します。 詳細については、「方法: [モジュール] ウィンドウを使用する」を参照してください。

[イミディエイト] ウィンドウを使用する

[イミディエイト] ウィンドウを使用すると、デザイン時に DLL の関数またはメソッドを評価できます。 [イミディエイト] ウィンドウは、呼び出し元アプリの役割を果たします。

メモ

ほとんどのプロジェクトの種類で、デザイン時に [イミディエイト] ウィンドウを使用できます。 SQL、Web プロジェクト、またはスクリプトではサポートされていません。

たとえば、Class1 クラスの Test という名前のメソッドをテストするには、次のようにします。

  1. DLL プロジェクトを開き、[デバッグ]>[ウィンドウ]>[イミディエイト] を選択するか、Ctrl+Alt+I キーを押して、[イミディエイト] ウィンドウを開きます。

  2. 次の C# コードを [イミディエイト] ウィンドウに入力して Enter キーを押し、Class1 型のオブジェクトをインスタンス化します。 このマネージド コードは、構文を適切に変更することで C# と Visual Basic で動作します。

    Class1 obj = new Class1();
    

    C# では、すべての名前を完全修飾する必要があります。 言語サービスによって式の評価が試みられる時点で、すべてのメソッドまたは変数が現在のスコープとコンテキストに含まれている必要があります。

  3. Test が 1 つの int パラメーターを受け取るものと想定し、 Test [イミディエイト] ウィンドウを使用して を評価します。

    ?obj.Test(10);
    

    結果が [イミディエイト] ウィンドウに出力されます。

  4. Test の中にブレークポイントを配置し、関数を再び評価してデバッグを継続できます。

    ブレークポイントにヒットし、Test をステップ実行できます。 Test の実行が終了すると、デバッガーはデザイン モードに戻ります。

混合モードのデバッグ

マネージド コードまたはネイティブ コードで、DLL の呼び出し元アプリを記述できます。 ネイティブ アプリでマネージド DLL が呼び出されていて、その両方をデバッグする場合は、プロジェクトのプロパティでマネージド デバッガーとネイティブ デバッガーの両方を有効にすることができます。 厳密なプロセスは、DLL プロジェクトまたは呼び出し元アプリのプロジェクトのどちらからデバッグを開始するかによって異なります。 詳細については、「方法: 混合モードでデバッグする」を参照してください。

マネージド呼び出し元プロジェクトからネイティブ DLL をデバッグすることもできます。 詳細については、マネージド コードとネイティブ コードをデバッグする方法に関するページを参照してください。