教程:在同一调试会话中调试 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 项目创建文件:
- 打开 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平台。 如果调用应用为 .NET Core(始终以 64 位模式运行),请选择x64作为平台。
- 在解决方案资源管理器中,选择Mixed_Mode_Debugging项目节点,然后选择属性图标,或右键单击项目节点并选择属性。
- 在“属性”窗格顶部,确保配置设置为Active(Debug),平台与在工具栏中设置的内容相同:x64,或win32x86 平台。
- 重要:如果将平台从x86切换到x64,则必须重新配置新平台的属性。
- 在左窗格中配置属性下,选择“链接器>高级”,然后在“无入口点”旁边的下拉列表中,选择“无”。 如果必须将其更改为“否”,请选择“应用”。
- 在配置属性下,选择常规,然后在配置类型旁边的下拉列表中,选择动态库(.dll)。 选择“应用”,然后选择“确定”。
- 在解决方案资源管理器中选择项目,然后选择生成>生成解决方案,按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\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();
}
}
}
- 在新代码中,将 [DllImport] 中的文件路径替换为刚创建的Mixed_Mode_Debugging.dll的文件路径。 有关提示,请参阅代码注释。 确保替换 username 占位符。
- 选择“文件>”以保存“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,或选择“调试”>“单步执行”。
- “Mixed_Mode.h”本机头文件打开,在调试器暂停位置看到黄色箭头。
- 现在,可以设置并命中断点以及检查本机代码或托管代码中的变量。
- 将鼠标悬停在源代码中的变量上以查看其值。
- 在“自动”和“局部变量”窗口查看变量和变量值。
- 在调试器中暂停时,还可以使用“监视”窗口和“调用堆栈”窗口。
- 再按 F11,将调试器推进一行。
- 按 Shift+F11 或选择“调试”>“单步跳出”,在托管应用中继续执行并再次暂停。
- 按F5或选择绿色箭头以继续调试应用。
祝贺! 你已完成有关混合模式调试的教程。
下一步
本教程介绍了如何通过启用混合模式调试来调试托管应用中的本机代码。 有关其他调试器功能的概述,请参阅:
Visual Studio 调试器入门
本文原文来自微软官方文档
热门推荐
新生儿黄疸的蓝光治疗
骨质疏松了,您该怎么吃?
法院调解的原则有哪些
BIM对土木工程就业的影响及前景分析
Reflexion:探索具有动态记忆和自我反思能力的自主智能体
三国杀:游戏能“家喻户晓”三国杀画师功不可没!
新概念第二册语法解析:重读闭音节结尾的词
走路像踩针?缓解足底筋膜炎的方法来了
住人集装箱的防火材料及安全性探讨
一文详解三角形面积计算:从基础到应用
探索温度的奥秘:深入了解摄氏度、华氏度和开氏度
被女孩删除后想挽回?这样做才能重获她的心!
用户画像构建与精准定位:深度解析与案例
烟台樱桃和车厘子的区别
户外装备如何在野外露营时保持干燥?揭秘防霉秘诀
免赔额是什么意思?一篇文章给你讲清楚
Excel考勤表一键填满教程:使用宏、公式等多种方法
来云南我只做一件事:吃洋芋
脱敏治疗:过敏性鼻炎的「呼吸重塑」
生肖申猴和生肖辰龙,两人的感情运势与差异
二手房交易秘籍:简化流程与避坑指南
传统与现代:肠粉的演变与发展
构建完善的社会保障体系:策略与实践
汽车轮胎更换指南:何时、为何及如何更换
如何高效提取图片中的文字,包括隐藏的暗水印?
网络招聘:问题与对策
chkdsk无法供raw驱动器使用(u盘chkdsk修复不了raw怎么办)
微星主板如何使用PE装系统(详细教程及步骤,让您轻松安装系统)
如何看待黄金作为避险资产的作用?这种作用如何在市场波动中体现和发挥?
电感器是什么?电感器的工作原理、有什么用和类型