如何从本地C代码调用C#(Mono,.Net)的方法和委托

4

如何从本地的C代码中调用由托管代码编写的C#方法(可能在类或库中)(以及如何实现)?

谢谢。

编辑:我主要是指Mono或甚至Portable.NET中的“C#”,操作系统为Linux。


可能是如何导出C#方法?的重复问题。 - Hans Passant
3个回答

6
您的C代码可以定义函数来注册回调。C#代码可以P/Invoke这些函数,并将托管委托作为参数传递。编组代码将自动将其转换为C函数指针。
或者,从C端接近,您可以使用Mono嵌入API加载程序集,查找MonoMethods并调用它们。
使用嵌入式API要复杂得多。如果您的入口点在C中,则必须使用嵌入式API,但更容易的方法是编写托管方法来执行回调注册和任何其他托管设置,然后只需从C代码中加载和调用该单个方法即可。

入口点有时可能是C语言,也可能是汇编语言。我会尝试按照这些http://www.mono-project.com/Embedding_Mono说明进行操作。如果您有其他好的教程,请告诉我。 - Gobliins

3

在MSDN网站上有一个托管/非托管代码互操作概述,可能会为您提供一些帮助。以下是摘录:

直接访问托管 API 如果未托管的客户端是用 C++ 编写的,则可以将其编译为“混合模式映像”使用 Visual Studio .NET C++ 编译器。完成此操作后,未托管的客户端可以直接访问任何托管 API。但是,在从未托管的代码中访问托管对象时,适用一些编码规则;有关详细信息,请查看 C++ 文档。 直接访问是首选选项,因为它不需要托管 API 开发人员考虑任何特殊情况。他们可以根据托管 API 设计指南 (DG) 设计他们的托管 API,并确信该 API 仍然可供未托管的调用方访问。
将托管 API 公开为 COM API 每个公共托管类都可以通过 COM 互操作向未托管的客户端公开。这个过程非常容易实现,因为 COM 互操作层会处理所有 COM 管道。因此,例如,每个托管类似乎都实现了 IUnknown、IDispatch、ISupportErrorInfo 和其他几个标准 COM 接口。 尽管将托管 API 公开为 COM API 很容易,但托管和 COM 对象模型非常不同。因此,将托管 API 公开到 COM 应始终是一个明确的设计决策。托管世界中可用的一些功能在 COM 世界中没有等效项,因此无法从 COM 客户端使用。因此,托管 API 设计指南 (DG) 与与 COM 的兼容性之间经常存在紧张关系。 如果 COM 客户端很重要,请根据托管 API 设计指南编写您的托管 API,然后编写一个薄的面向 COM 的托管包装器,该包装器将公开给 COM。
将托管 API 公开为平面 API 有时未托管的客户端无法使用 COM。例如,它们可能已经编写为使用平面 API,并且无法更改或重新编译。C++ 是唯一允许您将托管 API 公开为平面 API 的高级语言。这样做并不像将托管 API 公开为 COM API 那么简单。这是一种非常高级的技术,需要具有 C++ 互操作和托管和未托管世界之间差异的高级知识。 仅在绝对必要时将托管 API 公开为平面 API。如果您别无选择,请务必查看 C++ 文档,并充分了解所有限制。

1
C++/CLI 只能在 Windows 上运行,而 "mono" 标签的存在表明跨平台支持可能是可取的。 - Mikayla Hutchinson

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接