【问题标题】:How to break in c++ code called from c# interop如何中断从 c# interop 调用的 c++ 代码
【发布时间】: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> array0{11,12,13,14};
    std::vector<int> array1{21,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++ 代码中的工作方式。相当重要的是,它以这种方式工作,因为当断言失败时,您通常没有可查看的源代码,因此无法判断出了什么问题。如对话框所述,您必须单击“重试”按钮。

标签: c# c++ debugging interop visual-studio-2019


【解决方案1】:

按照 Kevin Gosse 的建议,并在 MSFT documentation 中详细说明,只需启用混合模式调试

为托管调用应用启用混合模式调试

  1. 在解决方案资源管理器中选择 C# 或 Visual Basic 项目并选择属性图标,按 Alt+Enter,或右键单击并选择 属性。

  2. 选择“调试”选项卡,然后选择“启用本机代码调试”。

  3. 关闭属性页面以保存更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2014-04-07
    • 2016-01-25
    相关资源
    最近更新 更多