教程:在同一个调试会话中调试 C# 和 C++

Visual Studio 允许你在调试会话中启用多个调试器类型,这名为混合模式调试。 在本教程中,将了解如何在单一调试会话中调试托管代码和本机代码。

本教程展示如何在托管应用内调试本机代码,但你也可以在本机应用内调试托管代码。 调试器还支持其他混合模式调试类型,如调试 Python 和本机代码以及在应用类型(如 ASP.NET)中使用脚本调试器。

在本教程中,你将:

  • 创建简单的本机 DLL
  • 创建简单 .NET Core 或 .NET Framework 应用以调用 DLL
  • 配置混合模式调试
  • 启动调试器
  • 命中托管应用中的断点
  • 单步执行本机代码

先决条件

必须安装 Visual Studio 并具有下列工作负荷:

  • 使用 C++ 的桌面开发
  • .NET 桌面开发

必须安装 Visual Studio 并具有下列工作负荷:

  • 使用 C++ 的桌面开发
  • .NET 桌面开发或 .NET Core 跨平台开发,具体取决于你想要创建的应用类型。

如果未安装 Visual Studio,请转到 Visual Studio 下载页面,进行免费安装。

如果已安装 Visual Studio,但没有所需工作负荷,请选择 Visual Studio“新建项目”对话框左窗格中的“打开 Visual Studio 安装程序” 。 在 Visual Studio 安装程序中,选择所需工作负荷,然后选择“修改”。

创建简单的本机 DLL

创建 DLL 项目的文件:

  1. 打开 Visual Studio 并创建一个项目。

    按 Esc 关闭启动窗口。 键入 Ctrl+Q 以打开搜索框,键入“空项目”,选择“模板”,然后选择“空项目”(C++) 。 在出现的对话框中,选择“创建”。 然后,键入名称(如“Mixed_Mode_Debugging”)并单击“创建” 。

    如果没有看到“空项目”项目模板,请转到“工具”>“获取工具和功能...”,这会打开 Visual Studio 安装程序 。 Visual Studio 安装程序启动。 选择“使用 C++ 的桌面开发”工作负载,然后选择“修改”按钮 。

    Visual Studio 随即创建项目。

  2. 在“解决方案资源管理器”中选择“源文件”,然后选择“项目”>“添加新建项” 。 或者,右键单击“源文件”,然后选择“添加”>“新项” 。

    如果看不到所有项模板,请选择“显示所有模板”。

  3. 在“新项”对话框中,选择“C++ 文件(.cpp)” 。 在“名称”字段中键入“Mixed_Mode.cpp”,然后选择“添加” 。

    Visual Studio 将新 C++ 文件添加到“解决方案资源管理器”。

  4. 将下列代码复制到“Mixed_Mode.cpp”:

    #include "Mixed_Mode.h"
    
  5. 在“解决方案资源管理器”中选择“头文件”,然后选择“项目”>“添加新项” 。 或者,右键单击“头文件”,然后选择“添加”>“新项” 。

    如果看不到所有项模板,请选择“显示所有模板”。

  6. 在“新项”对话框中,选择“头文件(.h)” 。 在“名称”字段中键入“Mixed_Mode.h”,然后选择“添加” 。

    Visual Studio 将新的头文件添加到“解决方案资源管理器”。

  7. 将下列代码复制到“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
    
  8. 选择“文件”>“保存全部”,或按 Ctrl+Shift+S 保存文件 。

配置并生成 DLL 项目:

  1. 在 Visual Studio 工具栏中,选择“调试”配置以及“x86”或“x64”平台 。 如果调用的应用将是始终在 64 位模式下运行的 .NET Core,请选择“x64”作为平台。

  2. 在“解决方案资源管理器”中,选择“Mixed_Mode_Debugging”项目节点并选择“属性”图标,或右键单击项目节点并选择“属性” 。

  3. 在“属性”窗格的顶部,请确保将“配置”设置为“活动(调试)”以及将“平台”设为与你在工具栏中所设置的相同:“x64”或“Win32”(适用于 x86 平台) 。

    重要

    如果将平台从“x86”切换到“x64”,或相反,则必须为新平台重新配置属性 。

  4. 在左窗格的“配置属性”下方选择“链接器”>“高级”,并在“无入口点”旁边的下拉列表中选择“否” 。 如果必须将其更改为“否”,请选择“应用” 。

  5. 在“配置属性”下方选择“常规”,并在“配置类型”旁边的下拉列表中选择“动态库(.dll)” 。 选择“应用”,然后选择“确定” 。

    Switch to a native DLL

  6. 在“解决方案资源管理器”中选择项目,然后选择“生成”>“生成解决方案”,按 F7 或右键单击该项目并选择“生成” 。

    该项目应顺利生成,没有错误。

创建简单的托管应用以调用 DLL

  1. 打开 Visual Studio 并创建一个新项目。

    按 Esc 关闭启动窗口。 键入 Ctrl+Q 以打开搜索框,键入“控制台”,选择“模板”,然后对 .NET Core 选择“控制台应用”,或对 C# 选择“控制台应用(.NET Framework)” 。 在出现的对话框中,选择“下一步”。

    然后键入名称(如 Mixed_Mode_Calling_App),单击“下一步”或“创建”(视具体提供的选项而定)。

    对于 .NET Core,选择建议的目标框架或 .NET 8,然后选择“创建”。

    如果没有看到正确的项目模板,请转到“工具”>“获取工具和功能...”,这会打开 Visual Studio 安装程序 。 根据先决条件所述选择正确的 .NET 工作负载,然后选择“修改”。

    注意

    还可以将新的托管项目添加到现有 C++ 解决方案。 我们将在新的解决方案中创建项目,以提高混合模式调试任务的难度。

    Visual Studio 创建空项目并在“解决方案资源管理器”中显示该项目。

  2. 使用下列代码替换“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();
            }
        }
    }
    
  3. 在新代码中,使用刚创建的“Mixed_Mode_Debugging.dll”的文件路径替换 [DllImport] 中的文件路径。 有关提示,请参阅代码注释。 确保替换 username 占位符。

  4. 选择“文件”>“保存 Program.cs”或按 Ctrl+S 以保存文件 。

配置混合模式调试

  1. 在“解决方案资源管理器”中,选择“Mixed_Mode_Calling_App”项目节点并选择“属性”图标,或右键单击项目节点并选择“属性” 。

  2. 在属性中启用本机代码调试。

    选择左窗格中的“调试”,选择“打开调试启动配置文件 UI”,然后选中“启用本机代码调试”复选框,然后关闭属性页以保存更改。 Enable mixed mode debugging

    选择左窗格中的“调试”,再选中“启用本机代码调试”复选框,然后关闭属性页以保存更改 。

    Enable mixed mode debugging

  3. 如果要从 .NET Framework 应用定位 x64 DLL,请将平台目标从“任何 CPU”更改为 x64。 为此,可能需要从“调试”工具栏的“解决方案平台”下拉列表中选择“配置管理器”。 然后,如果无法直接切换到 x64,请创建面向 x64 的新配置。

设置断点并开始调试

  1. 在 C# 项目中,打开“Program.cs”。 在下列代码行中设置断点,方法是点击最左侧边缘并选择该行再按 F9,或右键单击该行并选择“断点”>“插入断点” 。

    int result = Multiply(7, 7);
    

    一个红圈将出现在设置断点的左边缘中。

  2. 按 F5 并选择 Visual Studio 工具栏内的绿色箭头,或选择“调试”>“开始调试”来开始调试 。

    调试器在所设断点处暂停。 黄色箭头指示调试器当前的暂停位置。

单步执行和单步跳出本机代码

  1. 托管应用中的调试暂停时按 F11,或选择“调试”>“单步执行” 。

    “Mixed_Mode.h”本机头文件打开,在调试器暂停位置看到黄色箭头。

    Step into native code

    Step into native code

  2. 现在,可以设置并命中断点以及检查本机代码或托管代码中的变量。

    • 将鼠标悬停在源代码中的变量上,查看变量值。

    • 在“自动”和“局部变量”窗口查看变量和变量值 。

    • 在调试器中暂停时,还可以使用“监视”窗口和“调用堆栈”窗口 。

  3. 再按 F11,将调试器推进一行。

  4. 按 Shift+F11 或选择“调试”>“单步跳出”,在托管应用中继续执行并再次暂停 。

  5. 按 F5 或选择绿色箭头继续调试应用。

祝贺你! 你已完成混合模式调试的教程。

下一步

在本教程中,学习了如何通过启用混合模式调试在托管应用中调试本机代码。 有关其他调试器功能的概述,请参阅: