如何调用c#(mono,.net)方法,来自本地c的委托

是否可以从本机c代码(以及如何)调用托管代码(可能在类或库中)编写的c#方法?

谢谢

编辑:使用“c#”我主要是指mono或甚至portable.net,操作系统是Linux

您的C代码可以定义注册回调的函数。 C#代码可以P / Invoke这些函数,并将托管委托作为参数传递。 编组代码将透明地将这些转换为C函数指针。

或者,从C侧接近它,您可以使用Mono嵌入API加载程序集,查找MonoMethods并调用它们。

使用嵌入API要复杂得多。 如果您的入口点在C中,则必须使用嵌入API,但是简单地编写托管方法来执行回调注册和任何其他托管设置可能更容易,那么您只需加载并调用该单个方法来自C代码。

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

直接访问托管API

如果非托管客户端是用C ++编写的,则可以使用Visual Studio .NET C ++编译器将其编译为“混合模式映像”。 完成此操作后,非托管客户端可以直接访问任何托管API。 但是,某些编码规则适用于从非托管代码访问托管对象; 查看C ++文档以获取更多详细信息。

直接访问是首选选项,因为它不需要托管API开发人员的任何特殊考虑。 他们可以根据托管API设计指南(DG)设计其托管API,并确信非托管呼叫者仍可访问API。

将托管API公开为COM API

每个公共托管类都可以通过COM interop暴露给非托管客户端。 这个过程非常容易实现,因为COM互操作层负责所有的COM管道。 因此,例如,每个托管类似乎都实现了IUnknown,IDispatch,ISupportErrorInfo和一些其他标准COM接口。

尽管将托管API公开为COM API很容易,但托管和COM对象模型却截然不同。 因此,将托管API暴露给COM应始终是明确的设计决策。 托管世界中的某些function在COM世界中没有等效function,并且无法从COM客户端使用。 因此,托管API设计指南(DG)与COM兼容性之间通常存在紧张关系。

如果COM客户端很重要,请根据托管API设计指南编写托管API,然后围绕将向COM公开的托管API编写一个简单的COM友好托管包装器。

将托管API公开为Flat API

有时非托管客户端无法使用COM。 例如,它们可能已经被编写为使用平面API,无法更改或重新编译。 C ++是唯一允许您将托管API公开为平面API的高级语言。 这样做并不像将托管API公开为COM API那样简单。 这是一项非常先进的技术,需要先进的C ++互操作知识以及托管和非托管世界之间的差异。

仅在绝对必要时才将您的托管API公开为平面API。 如果您别无选择,请务必查看C ++文档并充分了解所有限制。

这是一个解决方案。 要从C调用C#函数,使用[DllExport]属性(与P / Invoke DllImport相反)。 https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports