繁体   English   中英

使用本机 C++、托管 C++ cli 和 C# 解决方案在混合模式下调试

[英]debugging in mixed mode with native C++, managed c++ cli, and c# solution

我有一个正在处理的多线程项目,启动项目设置为运行我的 UI 的 ac# 项目。 然后是一系列底层 C++ 原生项目,它们通过托管 C++/CLI 项目连接到 C#。 我已在 c# 启动项目“启用非托管调试”中启用,当我尝试调试本机代码时,我能够点击我设置的断点。 但是,在我尝试再次运行它并尝试再次击中断点后,它挂起。 例如,如果我有一个循环,我尝试在每次迭代中进入它,第二次迭代后程序挂起,我必须强制退出。 我在 Visual Studio 2010 中工作。以这种速度调试开始证明不是很有用,有什么办法可以排除这个问题?

当我想调试本机代码以及 C++/CLI 时,我会执行以下操作:

  1. 在 C# 应用程序中,选中 Build 选项卡中的Allow unsafe code和项目属性的 Debug 选项卡中的Enable unmanaged code debugging
  2. 对于 C++/CLI dll 项目,在属性的调试选项卡中,将调试器类型设置为Mixed

我们在调试复杂的混合代码应用程序时也遇到了问题,并发现 Visual Studio 在这些情况下并不那么可靠。 我的建议是:

  • 如果您正在尝试调试一段本机代码,请尝试使用本机项目作为调试器启动应用程序。 在项目设置下,“调试”选项卡将“调试器类型”设置为“混合”,这对我们来说有时会有所帮助(例如,本机项目可以是 DLL,只需在项目设置中将主 Exe 设置为调试目标即可);

  • 使用 WinDbg,您可以更可靠地调试托管/非托管混合代码应用程序;

当我试图从托管进入非托管代码时,我遇到了同样的问题,所以相反,我摆脱了托管端的所有断点并执行了以下操作:

1)通过File->Open->File(即我的source.cpp)打开你的非托管源文件

2)在那里设置一个断点

3) 开始您的托管代码调试(播放按钮)

它应该直接进入您的非托管代码......至少它对我有用......

好的,这里是我如何解决它,

简答:

  1. 为您的两个项目设置 Configuration_Properties->Debugging->Debugger_type: Mixed(.NET Framework)

    一种。 Purely Native 项目(非托管 C++ exe 使用托管 C++ CLR dll 导出的函数)

    C++/CLI - CLR 项目(托管 C++ dll 通过引用从纯托管 C# .NET dll 导出函数(对 C# dll 的引用已添加到托管 C++ CLR 项目的引用列表中))- 此项目作为接口 b /w 非托管和托管代码。

  2. 为托管 C++/CLI - CLR 项目设置 Configuration_Properties->Advanced->C++/CLI_Properties->Common_Language_Runtime_Support: Common Language Runtime Support (/clr) 和 .NET_Target_Framework_Version: xxx(在托管 C# 项目目标框架中指定)界面。

长答案:

我试图构建一个插件 DLL(C++ Native dll),它应该在使用 MFC/Win32 API 集的普通非托管环境(C++ Native)下运行。 首先,我尝试使用 Win32Api UI 元素,如窗口、线程等,它成为设计 UI 的核心,因为 VS2019 不给我设计编辑器,除非我将项目声明为 MFC 并引入不需要的 MFC 服务。

为了让我的 UI 开发更容易,

我创建了一个 C# dll(托管 dLL - 标准类库 .NET Core 项目),它使用面向 .NET 框架 4.7.2 的“Windows 窗体”

然后我创建了另一个 C++/CLI - CLR dll(托管 dLL - CLR 项目,它使用非托管 C++ 代码但在托管环境 clr.dll 中运行)。 这个 dll 充当一个接口,它使用 extern "C" __declspec(dllexport) 公开封装在 C 风格包装器函数中的托管 C# 代码中的函数

主/启动项目是一个纯原生 C++ (exe) 非托管应用程序,它使用从 C++/CLI - CLR 托管界面项目导出的函数,该项目在内部公开 UI 元素。

除非我手动加载托管 CLR C++ dll 的 .pdb 并强制启动非托管 C++ 应用程序的调试器类型为混合(.NET Framework),否则调试不可用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM