次の方法で共有


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

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

DLL を作成する

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

  • クラス ライブラリ (.NET、.NET Framework、およびその他のアプリ プラットフォーム)
  • Windows フォーム コントロール ライブラリ (.NET および .NET Framework)
  • Dynamic-Link ライブラリ (DLL) (C++)

Windows フォーム コントロール ライブラリのデバッグは、クラス ライブラリのデバッグと似ています。 詳細については、「 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 に必要なその他のファイルを検索できる必要があります。 カスタム ビルド タスクを作成して、これらのファイルを <project フォルダー>\Debug 出力フォルダーにコピーすることも、手動でファイルをコピーすることもできます。

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

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

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

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

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

  4. [Linker>General>Additional Libraries Directories] で、LIB ファイルを含むフォルダーを指定します。

  5. > > で、LIB ファイルの完全なパスとファイル名を指定します。

  6. [OK] を選択.

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

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

デバッグを開始する前に、必ず DLL のデバッグ バージョンをビルドしてください。 DLL をデバッグするには、呼び出し元アプリがその .pdb ファイル と DLL に必要なその他のファイルを検索できる必要があります。 詳細については、「 方法: デバッグ構成とリリース構成を設定する」を参照してください。

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

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

DLL をデバッグする

DLL を直接実行することはできません。 アプリ (通常は .exe ファイル) によって呼び出される必要があります。

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

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

DLL を呼び出すアプリは次のようになります。

  • DLL と同じソリューションまたは別のソリューション内の Visual Studio プロジェクトのアプリ。
  • テストコンピューターまたは実稼働コンピューターに既に展開され、実行されている既存のアプリ。
  • Web 上にあり、URL を介してアクセスされます。
  • DLL を埋め込む Web ページを含む Web アプリ。

呼び出し元アプリのデバッグを開始する前に、DLL にブレークポイントを設定します。 ブレークポイントの使い方の始め方を参照してください。 DLL ブレークポイントにヒットすると、コードをステップ実行して、各行のアクションを観察できます。 詳細については、「 デバッガーでのコードの移動」を参照してください

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

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

    または

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

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

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

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

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

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

  1. DLL プロジェクトを開いた状態で、Debug>> を選択するか、CtrlAlt+I+を押してイミディエイト ウィンドウを開きます。

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

    Class1 obj = new Class1();
    

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

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

    ?obj.Test(10);
    

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

  4. Testをデバッグし続けるには、その中にブレークポイントを配置し、関数をもう一度評価します。

    ブレークポイントにヒットし、Test をステップ実行できます。 実行が Testを離れた後、デバッガーはデザインモードに戻ります。

混合モードデバッグ

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

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