如何从我的 C++/CLI 代码进入非托管 C++ 库

Posted

技术标签:

【中文标题】如何从我的 C++/CLI 代码进入非托管 C++ 库【英文标题】:How to step into unmanaged C++ library from my C++/CLI code 【发布时间】:2011-08-02 19:48:07 【问题描述】:

我的解决方案中有以下三个项目: 1.C#库 2. C++/CLI 托管代码 3. C++非托管代码

我确实在我的 C# 项目中选中了“启用非托管代码调试”,并在 Debug/Win32 中构建了两个 C++ 项目。但是,我无法进入非托管代码 - 当我 F11 调用任何非托管方法时,它会显示一些随机/错误代码然后退出。

因为我的单元测试通过了,我知道我的非托管代码确实执行了。

我错过了什么?

【问题讨论】:

您是否有尝试进入的非托管代码的 .pdb 文件? 您可以尝试启动托管进程并暂停它(通过任何方式),在您的非托管项目中放置一个断点并选择“调试 - >附加进程”,选择托管进程并继续托管过程。 @Steven:是的,我确实看到了 vc90.pdb @Arne:你想进入哪些功能? vc90 是 Visual Studio 2008 的 Visual C 运行时。它包括标准 C 库,仅此而已。 【参考方案1】:

当我遇到这个问题时,它来自以下原因之一:

1) 未选中启用非托管代码调试。你已经解决了这个问题。

2) 将 EXE 构建为 x64 或任何 CPU(他们说 x64 可以工作,但事实并非如此)。我想你已经解决了这个问题。

3) 启用“仅我的代码”有时会导致非托管代码调试出现问题(工具、选项、调试器、仅我的代码)

4) C++ 项目设置中的调试选项不正确

5) PDB 文件丢失、损坏或不匹配。您可以通过在调试器中运行时尝试在 C++ 代码中设置断点来检查这一点。如果断点变成空心圆圈,则说明您的调试信息有问题。当你在调试模式下运行时,还要检查你的输出窗口——它应该告诉你谁的符号被加载了。

【讨论】:

对我来说,我认为“只是我的代码”可能是问题的一部分。【参考方案2】:

我经常看到这个问题以“其他”方式出现(即,从本机 C++ 到 C++/CLI),这通常是由于调试器没有真正了解它应该调试本机和托管代码。

通常对我来说,在配置属性中设置调试器类型 -> 将启动项目中的调试从“自动”设置为“混合”即可解决问题。

【讨论】:

我从“自动”切换到“混合”,这对我没有帮助。 我也没有。我的断点被命中,但我没有得到有关本地变量或监视窗口等中的任何变量的信息。 我也看到了。如果我只是 F5 调试或附加到 C# EXE,VS 不想加载混合调试器。每次调试时,我都需要指定我想要本地和 .NET 调试器。

以上是关于如何从我的 C++/CLI 代码进入非托管 C++ 库的主要内容,如果未能解决你的问题,请参考以下文章

用 C++/CLI 包装非托管 C++ - 一种正确的方法

尝试从 C++/CLI 调用非托管 C++ 时解决错误

(C++/CLI) 如何在 C++ CLI 中获取从本机代码到托管代码的回调?

将非托管方法作为回调传递给托管 C++/CLI 类

使用 C++/CLI 包装器将二维数组从 C# 传递到非托管 C++

C++/CLI:返回对非托管对象的引用