如何从本机 C(++) DLL 调用 .NET (C#) 代码?

Posted

技术标签:

【中文标题】如何从本机 C(++) DLL 调用 .NET (C#) 代码?【英文标题】:How to call .NET (C#) code from a native C(++) DLL? 【发布时间】:2011-01-19 15:22:32 【问题描述】:

我有一个 C# app.exe 和一个 C# my.dll。 my.dll .NET 项目链接到本机 C++ DLL (mynat.dll)(外部 C DLL 接口),并且从 C# 调用到 C++ DLL 可以正常工作。 (通过使用[DllImport("mynat.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] 属性。)

我现在需要添加的是让 C# dll 提供一些 C++ 代码可以调用的回调函数。理想情况下,mynat.dll C++ 代码将使用 LoadLibrary("my.dll") 加载 C# dll,然后使用 GetProcAddress 解析它可以调用的回调函数。 (请注意,在 C++ 代码调用 LoadLibrary 时,my.dll C# dll 已加载到进程中 - 此调用只是为了获取 dll 的句柄。)

但是,我不知道从 .NET DLL 导出“外部 C DLL 接口”的正确方法是什么

我需要做什么才能实现这一目标?

【问题讨论】:

Using a .net compiled dll inside native c++的可能重复 How to export c# methods?的可能重复 一开始我想说它是重复的,但是因为它是 C++ 而不是 Python,我认为它可以作为一个标志帖子,所以考虑不要关闭它。 @Filip:这是一个不同的问题。 【参考方案1】:

与流行的看法相反,这可能的。 见here。

【讨论】:

你刚才不是说这应该是一个势均力敌的投票吗?这几乎让我想要-1,只是因为你自相矛盾并不鼓励我的回答,然后在这里发布了完全相同的内容(你自己的答案)。 有趣的是,我们成为会员的时间完全相同,而您的代表人数增加了 10 万。这不公平;)@Lambert,您的回答应该是“关闭 - 可能重复”。 请注意,您链接到的这个站点并没有真正解释任何事情——它只是提供了一个可执行文件+dll(我什至找不到它的源代码),它“发挥了魔力”。不是一个真正令人满意的答案。【参考方案2】:

虽然 Unmanaged Exportsutility 的 link provided by SLaks 可能会或可能不会起作用,但我们在这里使用了一个类似的工具(来自不同的来源),并且由于签名可执行文件的问题已经放弃了这种方法。

我们已经得出以下结论,并将在未来这样做:

使 .NET 回调可用于纯本机模块的正确方法是编写一个 C++/CLR 项目,该项目对 .NET 程序集进行向上调用并导出本机接口。

[ .NET ] -> ----------- -> [ C(++) ]  ... via DllImport Attribute

[ .NET ] <- [ C++/CLR ] <- [ C(++) ]  ... "default" .NET interface + "default" native interface

【讨论】:

以上是关于如何从本机 C(++) DLL 调用 .NET (C#) 代码?的主要内容,如果未能解决你的问题,请参考以下文章

从 .Net 调用本机函数时参数值混乱

如何将整数从 C# 方法复制到本机 C DLL 函数

Visual Lisp:如何调用外部 C++ DLL 中的函数

JIT 编译后如何(以及在​​何处)加载本机代码?

我们如何使用WPF / C#可执行文件调试DLL(使用本机C / C ++的bulit)源?

如何从 Metro P/Invoke 到本机 dll?