调试从 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_exec
和 mono_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的联合调试