如何中断从 c# interop 调用的 c++ 代码
Posted
技术标签:
【中文标题】如何中断从 c# interop 调用的 c++ 代码【英文标题】:How to break in c++ code called from c# interop 【发布时间】:2020-10-10 13:19:23 【问题描述】:使用 Visual Studio 2019。从 c# 调用 c 函数很常见,但是当出现运行时错误时,我会得到一个弹出窗口:
不过,我想真正闯入 c++ 代码,以便调试它,特别是查看调用堆栈、观察局部变量、添加断点等。
如何做到这一点?
如果需要演示项目: https://github.com/mprevot/InteropDemo
我正在调用一个设计为失败的 c 函数:
#ifndef Pinvoke
#define Pinvoke extern "C" __declspec(dllexport)
#endif
std::wstring ToString(int number)
std::wstringstream s;
s << "got number " << number;
return s.str();
Pinvoke auto GetNumbers() -> void
std::vector<int> array011,12,13,14;
std::vector<int> array121,22,23;
for (size_t i = 0; i < 4; i++)
ToString(array0[i]);
for (size_t i = 0; i < 4; i++)
ToString(array1[i]);
我从 c# 调用这样的函数:
internal static class NativeLibCall
public const string _dll = "NativeLib.dll";
[DllImport(_dll, CallingConvention = CallingConvention.StdCall)]
internal static extern void GetNumbers();
public class NativeLibInterop
public void GetNumbers() => NativeLibCall.GetNumbers();
【问题讨论】:
需要使用混合模式调试:docs.microsoft.com/en-us/visualstudio/debugger/… 这就是断言在 C/C++ 代码中的工作方式。相当重要的是,它以这种方式工作,因为当断言失败时,您通常没有可查看的源代码,因此无法判断出了什么问题。如对话框所述,您必须单击“重试”按钮。 【参考方案1】:按照 Kevin Gosse 的建议,并在 MSFT documentation 中详细说明,只需启用混合模式调试:
为托管调用应用启用混合模式调试
在解决方案资源管理器中选择 C# 或 Visual Basic 项目并选择属性图标,按 Alt+Enter,或右键单击并选择 属性。
选择“调试”选项卡,然后选择“启用本机代码调试”。
关闭属性页面以保存更改。
【讨论】:
以上是关于如何中断从 c# interop 调用的 c++ 代码的主要内容,如果未能解决你的问题,请参考以下文章
从 const char* 复制到字节数组 C++/c# interop Marshal::Copy