【问题标题】:debugging in mixed mode with native C++, managed c++ cli, and c# solution使用本机 C++、托管 C++ cli 和 C# 解决方案在混合模式下进行调试
【发布时间】:2011-08-22 18:42:29
【问题描述】:

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

【问题讨论】:

  • 使用多个调试器实例。一种用于托管,一种用于非托管。当然,这意味着您必须根据情况进行连接和分离。当然,强大的单元和集成测试首先比整个应用程序调试要好得多。
  • @Ritch:关于多个调试器实例的建议听起来很有趣。恕我直言,值得全面回答。
  • @Ritch:我认为经常失败的单元和特别是。然后,集成测试将引导您使用调试器找出究竟出了什么问题!
  • @Martin 这就是我过去的做法。这是一个非常大的项目,但对于错误发生在栅栏的哪一侧却是微不足道的。

标签: c# c++ visual-studio-2010 debugging c++-cli


【解决方案1】:

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

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

【讨论】:

  • “允许不安全代码”对我来说很关键,我设置了“启用非托管代码”,但在我添加“允许不安全代码”之前它仍然会崩溃。
  • 我有一个 C# EXE(用于 UI),其中包含原生 DLL 中的遗留代码和一个我创建的“shim”C++ CLI DLL 以连接两者。我在本机代码中设置了断点,但调试器并没有停止,即使设置了“启用非托管代码”也是如此。我为 C# 项目做了“允许不安全代码”,并在我的 C++ CLI DLL 和本机 DLL 中将“调试器类型”设置为“混合”(代码在我的解决方案中),瞧——我在托管 和本机代码!耶!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    2) 在那里设置断点

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

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

    【讨论】:

      【解决方案4】:

      好的,这就是我的解决方法,

      简答:

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

        一个。纯原生项目(非托管 C++ exe 使用托管 C++ CLR dll 导出的函数)

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

      2. 设置 Configuration_Properties->Advanced->C++/CLI_Properties->Common_Language_Runtime_Support:托管 C++/CLI - CLR 项目的公共语言运行时支持 (/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++ 应用程序的调试器类型强制为 Mixed(.NET Framework)

      【讨论】:

      • 这对我有用。谢谢你,mahee96。 “混合”而不是“自动”会有所作为。
      • @Gisway 很高兴它有帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      相关资源
      最近更新 更多