调试从 C++ 调用的 C# dll(嵌入 Mono)

Posted

技术标签:

【中文标题】调试从 C++ 调用的 C# dll(嵌入 Mono)【英文标题】:Debug a C# dll called from C++ (with Mono embedded) 【发布时间】:2020-07-21 19:22:53 【问题描述】:

我有一个用 C++ 编写的运行时(嵌入了 Mono),它使用 mono_jit_execmono_runtime_invoke 调用用 C# 编写的 dll 中的函数。胶水代码是用CppSharp 生成的——我认为这里不相关,只是提一下。

到目前为止一切都很好,我可以双向交流。

我现在想要的是仅使用 Visual Studio 调试 C# 代码(我在 macOS 上使用的是 2019 版)。所以在我的 C# 项目中,我转到 Run Configuration 并选择了指向我的 C++ 程序集的 Start external program 选项。之后,我设置了一些断点,但是当我在调试模式下运行 C# 项目时,它们从未被触发。

为什么不工作 - 还有其他需要做的事情吗?是因为涉及到 Mono 吗?

【问题讨论】:

因为 VS 只有其 .NET Framework 和 .NET Core 兼容的调试器,不适用于 Mono。在这样的一天(Mono 即将消失),您可能应该尝试嵌入 .NET Core docs.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting 为什么说 Mono 会消失?这似乎是一个活跃的项目。除此之外,我需要将我的 C++ 方法暴露给 C# 并使用 DllImport("__Internal") 直接调用它们,而 .NET Core 不提供此类功能。 .NET 5 将成为统一选项,在 .NET Core 与 Mono CLR 合并之后。如果不迁移到 .NET 5,Mono 的其他组件将很快消失。 MonoDevelop 已经走到了尽头,还有其他指标。因此,如果您想避免浪费精力,请立即开始使用 .NET Core。 我明白你的意思,这绝对是需要考虑的事情,因为我现在开始进行这种集成。问题是:有没有办法像我使用 Mono 一样使用 .NET Core 直接从 C# 调用主机方法?我不想跑题,所以我创建了一个new question。 【参考方案1】:

好的,所以答案是目前不支持。

一种解决方法是使用 Visual Studio 或 Visual Studio Code 的插件进行远程调试,如 Unity does。

一个可用的扩展是VS Code Mono Debug,它基于SDB: Mono Soft Debugger Client。

【讨论】:

以上是关于调试从 C++ 调用的 C# dll(嵌入 Mono)的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以调试从 C# DllImport 调用的 c++ dll?

使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统

C#调用C++DLL的小总结5---和C++的DLL的联合调试

在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试

在 C# 中调试 c++ dll

我如何调试在外部 C# 应用程序中 SWIGed 的 C++ DLL(不能从调试器启动)