教程:在同一调试会话中调试 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),并单击“创建”

    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 工具栏中,选择 调试 配置,x86x64 平台。 如果调用应用为 .NET Core(始终以 64 位模式运行),请选择 x64 作为平台。

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

  3. 在“属性”窗格顶部,确保 配置 设置为 Active(Debug)平台 与在工具栏中设置的内容相同:x64,或 win32 x86 平台。

    重要

    如果将平台从 x86 切换到 x64,则必须重新配置新平台的属性。

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

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

    切换到本机 DLL

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

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

创建一个简单的托管应用来调用 DLL

  1. 打开 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,然后选择“创建”。

    如果未看到正确的项目模板,请转到 工具>获取工具和功能...,这将打开 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. 在新代码中,将 [DllImport] 中的文件路径替换为刚创建的 Mixed_Mode_Debugging.dll 的文件路径。 有关提示,请参阅代码注释。 确保替换 username 占位符。

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

配置混合模式调试

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

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

    .NET 代码

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

    启用混合模式调试

    .NET Framework 代码

    在左侧菜单中,选择“调试”。 然后,在 调试器引擎 部分中,选择 启用本机代码调试 属性,然后关闭属性页以保存更改。

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

    启用混合模式调试

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

设置断点并开始调试

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

    int result = Multiply(7, 7);
    

    在设置断点的左边距中会出现一个红色圆圈。

  2. F5,选择 Visual Studio 工具栏中的绿色箭头,或者选择 调试>启动调试 来开始调试。

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

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

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

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

    单步执行本机代码

    单步执行本机代码

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

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

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

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

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

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

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

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

下一步

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