Visual Studio では、混合モード デバッグと呼ばれるデバッグ セッションで複数の種類のデバッガーを有効にすることができます。 このチュートリアルでは、単一のデバッグ セッションでマネージド コードとネイティブ コードの両方をデバッグする方法について説明します。
このチュートリアルでは、マネージド アプリからネイティブ コードをデバッグする方法を示しますが、 ネイティブ アプリからマネージド コードをデバッグすることもできます。 デバッガーでは、 Python やネイティブ コードのデバッグ、ASP.NET などのアプリの種類でのスクリプト デバッガーの使用など、他の種類の混合モード デバッグもサポートしています。
このチュートリアルでは、次の操作を行います。
- 単純なネイティブ DLL を作成する
- DLL を呼び出す単純な .NET Core または .NET Framework アプリを作成する
- 混合モード デバッグを構成する
- デバッガーを起動する
- マネージド アプリでブレークポイントに到達する
- ネイティブ コードにステップ インする
前提条件
次のワークロードで Visual Studio がインストールされている必要があります。
- C++ を使用したデスクトップ開発
- .NET デスクトップ開発
次のワークロードで Visual Studio がインストールされている必要があります。
- C++ を使用したデスクトップ開発
- 作成 するアプリの種類に応じて、 .NET デスクトップ開発または .NET Core クロス プラットフォーム開発。
Visual Studio をお持ちでない場合は、Visual Studio のダウンロード ページに移動して無料でインストールしてください。
Visual Studio がインストールされていても、必要なワークロードがない場合は、Visual Studio の [新しいプロジェクト] ダイアログ ボックスの左側のウィンドウで [Visual Studio インストーラーを開く] を選択します。 Visual Studio インストーラーで、必要なワークロードを選択し、[ 変更] を選択します。
単純なネイティブ DLL を作成する
DLL プロジェクトのファイルを作成するには:
Visual Studio を開き、プロジェクトを作成します。
Esc キーを押してスタート ウィンドウを閉じます。 Ctrl + Q キーを押して検索ボックスを開き、「空のプロジェクト」と入力し、C++ の空のプロジェクトを選択します。 表示される [ 新しいプロジェクトの構成 ] ダイアログ ボックスで、 Mixed_Mode_Debugging などの名前を入力し、[ 作成] をクリックします。
Esc キーを押してスタート ウィンドウを閉じます。 Ctrl + Q キーを押して検索ボックスを開き、「空のプロジェクト」と入力し、[テンプレート] を選択してから、[C++ の空のプロジェクト] を選択します。 表示されたダイアログボックスで、を選び、を作成します。 次に、 Mixed_Mode_Debugging などの名前を入力し、[ 作成] をクリックします。
空のプロジェクト プロジェクト テンプレートが表示されない場合は、[ツール>Get Tools and Features...] に移動し、Visual Studio インストーラーを開きます。 Visual Studio インストーラーが起動します。 [C++ によるデスクトップ開発] ワークロードを選択し、[変更] を選択します。
Visual Studio によってプロジェクトが作成されます。
ソリューション エクスプローラーで[ソース ファイル]、[プロジェクト]、[新しい項目の追加>の順に選択します。 または、[ ソース ファイル ] を右クリックし、[ 追加>新しいアイテム] を選択します。
すべての項目テンプレートが表示されない場合は、[すべてのテンプレートの表示] を選択します。
[ 新しい項目] ダイアログで、 C++ ファイル (.cpp) を選択します。 [名前] フィールドに「Mixed_Mode.cpp」と入力し、[追加] を選択します。
Visual Studio によって、ソリューション エクスプローラーに新しい C++ ファイルが追加 されます。
次のコードを Mixed_Mode.cppにコピーします。
#include "Mixed_Mode.h"
ソリューション エクスプローラーで、[ヘッダー ファイル] を選択し、[プロジェクト] > [新しい項目の追加] を選択します。 または、[ ヘッダー ファイル ] を右クリックし、[ 追加>新しいアイテム] を選択します。
すべての項目テンプレートが表示されない場合は、[すべてのテンプレートの表示] を選択します。
[ 新しい項目] ダイアログで、[ ヘッダー ファイル (.h)] を選択します。 [名前] フィールドに「Mixed_Mode.h」と入力し、[追加] を選択します。
Visual Studio によって、 ソリューション エクスプローラーに新しいヘッダー ファイルが追加されます。
次のコードを Mixed_Mode.h にコピーします。
#ifndef MIXED_MODE_MULTIPLY_HPP #define MIXED_MODE_MULTIPLY_HPP extern "C" { __declspec(dllexport) int __stdcall mixed_mode_multiply(int a, int b) { return a * b; } } #endif
[ファイル>すべて保存] を選択するか、Ctrl+Shift+S キーを押してファイルを保存します。
DLL プロジェクトを構成してビルドするには:
Visual Studio ツール バーで、[ デバッグ 構成] と [ x86 または x64 プラットフォーム] を選択します。 呼び出し元アプリが .NET Core で、常に 64 ビット モードで実行される場合は、プラットフォームとして x64 を選択します。
ソリューション エクスプローラーで、Mixed_Mode_Debugging プロジェクト ノードを選択し、[プロパティ] アイコンを選択するか、プロジェクト ノードを右クリックして [プロパティ] を選択します。
[プロパティ] ウィンドウの上部で、構成が Active (Debug) に設定されており、プラットフォームがツール バーで設定した内容 (x64、または x86 プラットフォームの Win32) と同じであることを確認します。
重要
プラットフォームを x86 から x64 またはその逆に切り替える場合は、新しいプラットフォームのプロパティを再構成する必要があります。
左側のウィンドウの [構成プロパティ ] で、[ リンカー>Advanced] を選択し、[ エントリ ポイントなし] の横にあるドロップダウンで [ いいえ] を選択します。 [いいえ] に変更する必要がある場合は、[適用] を選択します。
[ 構成プロパティ] で [ 全般] を選択し、[ 構成の種類] の横にあるドロップダウンで、[ 動的ライブラリ (.dll)] を選択します。 [Apply]\(適用\) を選択し、次に [OK] を選択します。
ソリューション エクスプローラーでプロジェクトを選択し、[ビルド>ソリューションのビルド] を選択するか、F7 キーを押すか、プロジェクトを右クリックして [ビルド] を選択します。
プロジェクトはエラーなしでビルドする必要があります。
DLL を呼び出す単純なマネージド アプリを作成する
Visual Studio を開き、新しいプロジェクトを作成します。
Esc キーを押してスタート ウィンドウを閉じます。 Ctrl + Q キーを押して検索ボックスを開き、「コンソール」と入力し、.NET または .NET Framework 用の C# コンソール アプリを選択します。
Esc キーを押してスタート ウィンドウを閉じます。 Ctrl + Q キーを押して検索ボックスを開き、「コンソール」と入力し、[テンプレート] を選択してから、[.NET Core 用コンソール アプリ] または [C# 用コンソール アプリ (.NET Framework)] を選択します。 表示されたダイアログ ボックスで、[ 次へ] を選択します。
次に、 Mixed_Mode_Calling_App などの名前を入力し、[ 次へ ] または [作成] をクリックします。どちらのオプションでも使用できます。
.NET Core または .NET 5 以降の場合は、推奨されるターゲット フレームワークまたは .NET 8 を選択し、[ 作成] を選択します。
正しいプロジェクト テンプレートが表示されない場合は、[ ツール>Get Tools and Features...] に移動し、Visual Studio インストーラーを開きます。 前提条件の説明に従って適切な .NET ワークロードを選択し、[ 変更] を選択します。
注
新しいマネージド プロジェクトを既存の C++ ソリューションに追加することもできます。 混合モードデバッグ タスクをより困難にするために、新しいソリューションでプロジェクトを作成しています。
Visual Studio によって空のプロジェクトが作成され、 ソリューション エクスプローラーに表示されます。
Program.cs内のすべてのコードを次のコードに置き換えます。
using System; using System.Runtime.InteropServices; namespace Mixed_Mode_Calling_App { public class Program { // Replace the file path shown here with the // file path on your computer. For .NET Core, the typical (default) path // for a 64-bit DLL might look like this: // C:\Users\username\source\repos\Mixed_Mode_Debugging\x64\Debug\Mixed_Mode_Debugging.dll // Here, we show a typical path for a DLL targeting the **x86** option. [DllImport(@"C:\Users\username\source\repos\Mixed_Mode_Debugging\Debug\Mixed_Mode_Debugging.dll", EntryPoint = "mixed_mode_multiply", CallingConvention = CallingConvention.StdCall)] public static extern int Multiply(int x, int y); public static void Main(string[] args) { int result = Multiply(7, 7); Console.WriteLine("The answer is {0}", result); Console.ReadKey(); } } }
新しいコードで、
[DllImport]
のファイル パスを、先ほど作成した Mixed_Mode_Debugging.dll へのファイル パスに置き換えます。 ヒントについては、コード コメントを参照してください。 ユーザー名のプレースホルダーは必ず置き換えてください。[ファイル>保存] Program.csを選択するか、Ctrl+Sキーを押してファイルを保存します。
混合モード デバッグを構成する
ソリューション エクスプローラーで、Mixed_Mode_Calling_App プロジェクト ノードを選択し、[プロパティ] アイコンを選択するか、プロジェクト ノードを右クリックして [プロパティ] を選択します。
プロパティでネイティブ コードデバッグを有効にします。
.NET コード
左側のウィンドウで [ デバッグ ] を選択し、[ デバッグ起動プロファイル UI を開く] を選択し、[ ネイティブ コード デバッグを有効にする ] チェック ボックスをオンにして、プロパティ ページを閉じて変更を保存します。
.NET Framework のコード
左側のメニューで、デバッグを選択します。 次に、[ デバッガー エンジン ] セクションで[ ネイティブ コード デバッグを有効にする ] プロパティを選択し、プロパティ ページを閉じて変更を保存します。
左側のウィンドウで [ デバッグ ] を選択し、[ ネイティブ コードデバッグを有効にする ] チェック ボックスをオンにして、プロパティ ページを閉じて変更を保存します。
.NET Framework アプリから x64 DLL をターゲットとしている場合は、プラットフォームターゲットを 任意の CPU から x64 に変更します。 これを行うには、デバッグ ツール バーの [ソリューション プラットフォーム] ドロップダウンから Configuration Manager を選択することが必要な場合があります。 次に、x64 に直接切り替えることができない場合は、x64 を対象とする 新しい 構成を作成します。
ブレークポイントを設定してデバッグを開始する
C# プロジェクトで、 Program.csを開きます。 次のコード行にブレークポイントを設定するには、左端の余白をクリックし、行を選択して F9 キーを押すか、行を右クリックして [ ブレークポイント>ブレークポイントを挿入します。
int result = Multiply(7, 7);
ブレークポイントを設定した左余白に赤い円が表示されます。
F5 キーを押し、Visual Studio ツール バーの緑色の矢印を選択するか、デバッグ>デバッグの開始を選択してデバッグを開始します。
デバッガーは、設定したブレークポイントで一時停止します。 黄色の矢印は、デバッガーが現在一時停止されている場所を示します。
ネイティブ コードのステップ インとステップ アウト
マネージド アプリでデバッグが一時停止している間に F11 キーを押すか、 デバッグ>Step Into を選択します。
Mixed_Mode.h ネイティブ ヘッダー ファイルが開き、デバッガーが一時停止されている黄色の矢印が表示されます。
これで、ネイティブ コードまたはマネージド コード内でブレークポイントを設定して通過し、変数を検査できるようになりました。
ソース コード内の変数にカーソルを合わせると、その値が表示されます。
[自動変数] ウィンドウと [ローカル] ウィンドウで変数とその値を調べます。
デバッガーで一時停止中は、[ ウォッチ ] ウィンドウと [呼び出し履歴 ] ウィンドウを使用することもできます。
もう一度 F11 キーを押して、デバッガーを 1 行進めます。
Shift+F11 キーを押すか、デバッグ>Step Out を選択して実行を続行し、マネージド アプリでもう一度一時停止します。
F5 キーを押すか、緑色の矢印を選択してアプリのデバッグを続行します。
おめでとうございます! 混合モード デバッグに関するチュートリアルを完了しました。
次のステップ
このチュートリアルでは、混合モードデバッグを有効にして、マネージド アプリからネイティブ コードをデバッグする方法について説明しました。 その他のデバッガー機能の概要については、次を参照してください。