チュートリアル: 同じデバッグ セッションで C# と C++ をデバッグする
Visual Studio では、1 つのデバッグ セッションで複数のデバッガーの種類を有効にすることができます。これは混合モードのデバッグと呼ばれます。 このチュートリアルでは、1 つのデバッグ セッションで、マネージド コードとネイティブ コードの両方をデバッグすることを学習します。
このチュートリアルでは、マネージド アプリからネイティブ コードをデバッグする方法を示していますが、ネイティブ アプリからマネージド コードをデバッグすることもできます。 デバッガーは、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 のような名前を入力して、 [作成] をクリックします。
[空のプロジェクト] プロジェクト テンプレートが表示されない場合は、 [ツール]>[ツールと機能を取得...] に移動して、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] プラットフォームを選択します。 呼び出し元のアプリが常に 64 ビット モードで実行される .NET Core の場合は、プラットフォームとして [x64] を選択します。
ソリューション エクスプローラーで、 [Mixed_Mode_Debugging] プロジェクト ノードを選択し、 [プロパティ] アイコンを選択するか、プロジェクト ノードを右クリックして [プロパティ] を選択します。
[プロパティ] ウィンドウの上部で、 [構成] が [アクティブ (デバッグ)] に設定され、 [プラットフォーム] がツールバーで設定したプラットフォームと同じになっていることを確認します ( [x64] 、または x86 プラットフォームの場合は [Win32] )。
重要
プラットフォームを x86 から x64 (またはその逆) に切り替えた場合、新しいプラットフォーム用にプロパティを再構成する必要があります。
左側のウィンドウの [構成プロパティ] の下で、 [リンカー]>[詳細設定] の順に選択し、 [エントリポイントなし] の横のドロップダウンで [いいえ] を選択します。 [いいえ] に変更した場合は、 [適用] を選択します。
[構成プロパティ] の下で、 [全般] を選択し、 [構成の種類] の横にあるドロップダウンで [ダイナミック ライブラリ (.dll)] を選択します。 [適用] を選択し、 [OK] を選択します。
ソリューション エクスプローラーでプロジェクトを選択し、 [ビルド]>[ソリューションのビルド] の順に選択し、F7 キーを押すか、プロジェクトを右クリックして [ビルド] を選択します。
プロジェクトがエラーのない状態でビルドされます。
単純なマネージド アプリを作成して DLL を呼び出す
Visual Studio を起動し、新しいプロジェクトを作成します。
Esc キーを押してスタート ウィンドウを閉じます。 Ctrl + Q キーを押して検索ボックスを開き、「コンソール」と入力し、 [テンプレート] を選択して、.NET Core 用の [コンソール アプリ] か、C# 用の [コンソール アプリ (.NET Framework)] を選択します。 表示されたダイアログ ボックスで、 [次へ] を選択します。
次に、「Mixed_Mode_Calling_App」のような名前を入力し、 [次へ] または [作成] をクリックします (いずれかのオプションを使用できます)。
.NET Core の場合は、推奨されるターゲット フレームワークまたは .NET 8 を選択し、 作成を選択します。
正しいプロジェクト テンプレートが表示されない場合は、 [ツール]>[ツールと機能を取得...] に移動して、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 への実際のファイル パスに置き換えます。 ヒントとしてコード コメントを参照してください。 プレースホルダー username を必ず置き換えてください。[ファイル]>[Program.cs の保存] を選択するか、Ctrl+S キーを押してファイルを保存します。
混合モードのデバッグを構成する
ソリューション エクスプローラーで、 [Mixed_Mode_Calling_App] プロジェクト ノードを選択し、 [プロパティ] アイコンを選択するか、プロジェクト ノードを右クリックして [プロパティ] を選択します。
プロパティでネイティブ コードのデバッグを有効にします。
左側のウィンドウで [デバッグ] を選択し、 [デバッグ起動プロファイル UI を開く] を選択し、 [ネイティブ コードのデバッグを有効にする] チェック ボックスをオンにしてから、プロパティ ページを閉じて変更を保存します。
左側のウィンドウで [デバッグ] を選択し、 [ネイティブ コードのデバッグを有効にする] チェック ボックスをオンにしてから、プロパティ ページを閉じて変更を保存します。
.NET Framework アプリの x64 DLL をターゲットにしている場合は、プラットフォーム ターゲットを [すべての CPU] から x64 に変更します。 これを行うには、[デバッグ] ツール バーの [ソリューション プラットフォーム] ドロップダウンから [構成マネージャー] を選択します。 x64 に直接切り替えることができない場合は、x64 を対象とする新しい構成を作成します。
ブレークポイントを設定し、デバッグを開始する
C# プロジェクトで Program.cs を開きます。 コードの次の行にブレークポイントを設定するには、余白の左端をクリックして行を選択し、F9 キーを押すか、行を右クリックして [ブレークポイント]>[ブレークポイントの挿入] の順に選択します。
int result = Multiply(7, 7);
左側の余白のブレークポイントを設定した場所に赤い円が表示されます。
F5 キーを押して、Visual Studio のツールバーで緑色の矢印を選択するか、 [デバッグ]>[デバッグの開始] の順に選択してデバッグを開始します。
設定したブレークポイントのところでデバッガーが一時停止します。 黄色の矢印は、デバッガーが現在一時停止している場所を示します。
ネイティブ コードのステップ インとステップ アウト
マネージド アプリでデバッグが一時停止している間に、F11 キーを押すか、 [デバッグ]>[ステップ イン] の順に選択します。
Mixed_Mode.h ネイティブ ヘッダー ファイルが開き、デバッガーが一時停止されている場所に黄色の矢印が示されます。
これで、ブレークポイントを設定してそこにヒットしたら、ネイティブ コードまたはマネージド コード内の変数を検査できます。
ソース コード内の変数をポイントすると、その値が表示されます。
変数とその値は、 [自動変数] ウィンドウと [ローカル] ウィンドウで確認できます。
デバッガーで一時停止中に、ウォッチ ウィンドウと [呼び出し履歴] ウィンドウを使用することもできます。
もう一度 F11 キーを押して、デバッガーを 1 行進めます。
Shift+F11 キーを押すか、 [デバッグ]>[ステップ アウト] を選択して、マネージド アプリで実行を続行し、もう一度一時停止します。
F5 キーを押すか、緑色の矢印を選択してアプリのデバッグを続行します。
おめでとうございます! 混合モードのデバッグのチュートリアルを完了しました。
次のステップ
このチュートリアルでは、混合モード デバッグを有効化して、マネージド アプリからネイティブ コードをデバッグする方法について学習しました。 その他のデバッガー機能の概要については、次を参照してください。