问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/visualstudio/debugger/how-to-debug-managed-and-native-code?view=vs-2022

混合模式调试是Visual Studio的一项强大功能,它允许开发者在同一调试会话中同时调试托管代码(如C#)和本机代码(如C++)。这种能力在处理复杂项目时特别有用,例如当托管应用需要调用本机DLL时。本文将通过一个具体的示例,详细介绍如何在Visual Studio 2022中配置和使用混合模式调试。

本文内容

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

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

在本教程中,你将:

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

先决条件

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

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

如果没有 Visual Studio,请转到Visual Studio 下载页免费安装它。

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

创建简单的本机 DLL

为 DLL 项目创建文件:

  1. 打开 Visual Studio 并创建项目。
  2. Esc关闭开始窗口。 要打开搜索框,请输入Ctrl + Q,然后输入空项目,选择模板,然后为 C++ 选择空项目。 在出现的对话框中,选择创建。 然后,键入一个名称(如Mixed_Mode_Debugging),然后单击创建
  3. 如果未看到空项目项目模板,请转到工具>获取工具和功能...,这将打开 Visual Studio 安装程序。 Visual Studio 安装程序将启动。 选择“使用 C++ 的桌面开发”工作负载,然后选择“修改”按钮。
  4. Visual Studio 创建项目。
  5. 解决方案资源管理器中,选择源文件,然后选择项目>添加新项。 或者,右键单击源文件并选择“添加>新项”。
  6. 如果未看到所有项模板,请选择显示所有模板
  7. “新建项”对话框中,选择C++文件(.cpp)。 在“名称”字段中键入“Mixed_Mode.cpp”,然后选择“添加”。
  8. Visual Studio 将新的C++文件添加到解决方案资源管理器
  9. 将以下代码复制到Mixed_Mode.cpp:
#include "Mixed_Mode.h"
  1. 解决方案资源管理器中,选择头文件,然后选择项目>添加新项。 或者,右击头文件,并选择添加>新项
  2. 如果未看到所有项模板,请选择显示所有模板
  3. 在“新项”对话框中,选择“头文件(.h)”。在名称字段中键入Mixed_Mode.h,然后选择添加
  4. Visual Studio 将新的头文件添加到解决方案资源管理器
  5. 将以下代码复制到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
  1. 选择“文件”>“全部保存”,或按 Ctrl+Shift+S 进行保存。

配置和生成 DLL 项目:

  1. 在 Visual Studio 工具栏中,选择调试配置,x86x64平台。 如果调用应用为 .NET Core(始终以 64 位模式运行),请选择x64作为平台。
  2. 解决方案资源管理器中,选择Mixed_Mode_Debugging项目节点,然后选择属性图标,或右键单击项目节点并选择属性
  3. 在“属性”窗格顶部,确保配置设置为Active(Debug)平台与在工具栏中设置的内容相同:x64,或win32x86 平台。
  4. 重要:如果将平台从x86切换到x64,则必须重新配置新平台的属性。
  5. 在左窗格中配置属性下,选择“链接器>高级”,然后在“无入口点”旁边的下拉列表中,选择“无”。 如果必须将其更改为“否”,请选择“应用”。
  6. 配置属性下,选择常规,然后在配置类型旁边的下拉列表中,选择动态库(.dll)。 选择“应用”,然后选择“确定”。
  7. 解决方案资源管理器中选择项目,然后选择生成>生成解决方案,按F7,或右键单击项目并选择生成
  8. 该项目应顺利生成,没有错误。

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

  1. 打开 Visual Studio 并创建新项目。
  2. Esc关闭开始窗口。 键入Ctrl + Q打开搜索框,键入控制台,选择模板,然后选择适用于 .NET Core 的控制台应用,或为 C#选择控制台应用(.NET Framework)。 在出现的对话框中,选择下一步
  3. 然后,键入名称(如Mixed_Mode_Calling_App),单击“下一步”“创建”,选择可用的选项。
  4. 对于 .NET Core,请选择建议的目标框架或 .NET 8,然后选择创建
  5. 如果未看到正确的项目模板,请转到工具>获取工具和功能...,这将打开 Visual Studio 安装程序。 根据先决条件选择正确的 .NET 工作负荷,然后选择修改
  6. 注意:还可以将新的托管项目添加到现有C++解决方案。 我们正在新解决方案中创建项目,以使混合模式调试任务更加困难。
  7. Visual Studio 创建空项目,并将其显示在解决方案资源管理器中。
  8. 将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\u0064\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();
        }
    }
}
  1. 在新代码中,将 [DllImport] 中的文件路径替换为刚创建的Mixed_Mode_Debugging.dll的文件路径。 有关提示,请参阅代码注释。 确保替换 username 占位符。
  2. 选择“文件>”以保存“Program.cs”,或按Ctrl+S保存文件。

配置混合模式调试

  1. 解决方案资源管理器中,选择Mixed_Mode_Calling_App项目节点,然后选择属性图标,或右键单击项目节点并选择属性
  2. 在属性中启用本机代码调试。
  3. .NET 代码
  • 在左窗格中选择调试,选择打开调试启动配置文件 UI,然后选择启用本机代码调试复选框,然后关闭属性页以保存更改。
  1. .NET Framework 代码
  • 在左侧菜单中,选择“调试”。然后,在调试器引擎部分中,选择启用本机代码调试属性,然后关闭属性页以保存更改。
  1. 在左窗格中选择调试,选中“启用本机代码调试”复选框,然后关闭属性页以保存更改。
  2. 如果要从 .NET Framework 应用定位 x64 DLL,请将平台目标从“任何 CPU”更改为 x64。为此,可能需要从“调试”工具栏的解决方案平台下拉列表中选择Configuration Manager。 然后,如果无法直接切换到 x64,请创建面向 x64 的新配置

设置断点并开始调试

  1. 在 C# 项目中,打开Program.cs。 在下列代码行中设置断点,方法是点击最左侧边缘并选择该行再按 F9,或右键单击该行并选择“断点”>“插入断点”。
int result = Multiply(7, 7);
  1. 在设置断点的左边距中会出现一个红色圆圈。
  2. F5,选择 Visual Studio 工具栏中的绿色箭头,或者选择调试>启动调试来开始调试。
  3. 调试器会在设置的断点上暂停。 黄色箭头指示调试器当前暂停的位置。

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

  1. 托管应用中的调试暂停时按 F11,或选择“调试”>“单步执行”。
  2. “Mixed_Mode.h”本机头文件打开,在调试器暂停位置看到黄色箭头。
  3. 现在,可以设置并命中断点以及检查本机代码或托管代码中的变量。
  • 将鼠标悬停在源代码中的变量上以查看其值。
  • 在“自动”和“局部变量”窗口查看变量和变量值。
  • 在调试器中暂停时,还可以使用“监视”窗口和“调用堆栈”窗口。
  1. 再按 F11,将调试器推进一行。
  2. 按 Shift+F11 或选择“调试”>“单步跳出”,在托管应用中继续执行并再次暂停。
  3. F5或选择绿色箭头以继续调试应用。

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

下一步

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

本文原文来自微软官方文档

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号