【发布时间】:2010-11-23 12:42:57
【问题描述】:
是否可以从原生 c 代码(以及如何)调用以托管代码(可能在类或库中)编写的 c# 方法?
谢谢
编辑:使用“c#”我主要指的是 mono 甚至是portable.net,操作系统是 Linux
【问题讨论】:
-
How to export c# methods? 的可能重复项
标签: c# c mono compilation native
是否可以从原生 c 代码(以及如何)调用以托管代码(可能在类或库中)编写的 c# 方法?
谢谢
编辑:使用“c#”我主要指的是 mono 甚至是portable.net,操作系统是 Linux
【问题讨论】:
标签: c# c mono compilation native
您的 C 代码可以定义函数来注册回调。 C# 代码可以 P/Invoke 这些函数,并将托管委托作为参数传递。编组代码会将这些透明地转换为 C 函数指针。
或者,从 C 端接近它,您可以使用 Mono 嵌入 API 来加载程序集、查找 MonoMethods 并调用它们。
使用嵌入 API 要复杂得多。如果您的入口点在 C 中,您将不得不使用嵌入 API,但简单地编写一个托管方法来执行回调注册和任何其他托管设置可能更容易,那么您只需加载和调用该单一方法来自 C 代码。
【讨论】:
MSDN 网站上有一个Overview of Managed/Unmanaged Code Interoperability,可能会为您提供一些启示。摘录如下:
直接访问托管 API
如果一个非托管客户端被写入 C++,它可以用 Visual Studio .NET C++ 编译器作为 “混合模式图像。”这是之后 完成后,非托管客户端可以 直接访问任何托管 API。 但是,一些编码规则确实适用于 访问托管对象 非托管代码;检查 C++ 文档以获取更多详细信息。
直接访问是首选选项 因为它不需要任何特殊的 托管 API 的考虑 开发商。他们可以设计他们的 根据托管 API 托管 API 设计指南 (DG) 并成为 相信 API 仍将是 非托管调用者可以访问。
将托管 API 公开为 COM API
每个公共托管类都可以 通过暴露给非托管客户 COM 互操作。这个过程非常简单 实现,因为 COM 互操作 层负责所有的 COM 管道。因此,例如,每个 托管类似乎实现 IUnknown, IDispatch, ISupportErrorInfo 和其他一些 标准 COM 接口。
尽管暴露托管 作为 COM API 的 API 易于管理、易于管理且 COM 对象模型非常不同。 因此,将托管 API 暴露给 COM 应该始终是明确的设计 决定。一些可用的功能 管理的世界没有等价物 在 COM 世界中,不会 可从 COM 客户端使用。因为 这之间经常有紧张关系 托管 API 设计指南 (DG) 和 与 COM 的兼容性。
如果 COM 客户端很重要,请编写 您的托管 API 根据 托管 API 设计指南,以及 然后写一个瘦的 COM 友好的托管 围绕您的托管 API 的包装器 将暴露给 COM。
将托管 API 公开为平面 API
有时不受管理的客户端无法使用 通讯。例如,他们可能已经 被编写为使用平面 API 并且不能 更改或重新编译。 C++ 是 只有高级语言允许 您将托管 API 公开为平面 蜜蜂。这样做并不像 直接暴露托管 API 作为 COM API。这是一个非常 先进的技术,需要 C++互操作的高级知识和 托管之间的差异 和未管理的世界。
将您的托管 API 公开为平面 API 仅在绝对必要时。如果你 别无选择,请务必检查 C++ 文档并充分了解 所有的限制。
【讨论】:
这里有一个解决方案。要从 C 调用 C# 函数,请使用 [DllExport] 属性(与 P/Invoke DllImport 相对)。 https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports
【讨论】: