如何中断从 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++ 代码的主要内容,如果未能解决你的问题,请参考以下文章

C#/C++ 回调类(非函数)互操作 - 如何?

如何从 C# 调用 C++ 类

从 const char* 复制到字节数组 C++/c# interop Marshal::Copy

遇到一个关于C#调用Microsoft.Office.Interop.Word实例化的一个问题

如何使用 C# 从 C++ 应用程序获取调用堆栈?

如何编写我的 C++ 函数以便我可以从 C# 调用它?