在不使用 COM 的情况下从 C++ 调用 C# 方法

Posted

技术标签:

【中文标题】在不使用 COM 的情况下从 C++ 调用 C# 方法【英文标题】:Call C# methods from C++ without using COM 【发布时间】:2010-09-21 15:00:34 【问题描述】:

有没有办法创建 C# 对象并从非托管 C++ 调用方法,但不使用 COM Iterop?我正在寻找类似 JNI(但适用于 .Net)的东西,您可以在其中手动创建 VM、创建对象等。

【问题讨论】:

【参考方案1】:

如果您使用的是 C++/CLI,那么您可以直接与托管世界和非托管代码进行交互,因此互操作是微不足道的。

您也可以自己托管 CLR,虽然托管 API 是基于 COM 的,但您可以创建任何托管对象。这个过程并不困难,因为听起来一些 API 调用封装了很多功能。网上有很多信息,例如“Hosting the Common Language Runtime”上的 MSDN 文档。

【讨论】:

【参考方案2】:

有一种从 .NET 类/方法导出 C 风格 API 的“未记录”方式。

这最终会导致 .NET dll 导出了可以从 C/C++ 调用的 API 或任何可以使用 .DLL 的东西。

如果您喜欢“阅读” (beh ;),您可以得到一本名为:Inside Microsoft® .NET IL Assembler 的书,您将在第 15 章:“托管方法作为非托管导出”中找到这种技术

还有一个不错的关于代码项目的示例项目,您可以将其用作 32 位环境的起点: http://www.codeproject.com/KB/dotnet/DllExport.aspx

【讨论】:

【参考方案3】:

您可以在 C++ 项目中逐个文件地决定是否使用托管 C++。尝试更改项目中文件的设置,使其按托管方式编译。将调用放在您的 C# 对象中。

跨越 C++/C# 边界是有代价的,所以你应该分析在哪里做。就像,您不想在循环中执行此操作。

【讨论】:

【参考方案4】:

我是jni4net 的作者,它是 JVM 和 CLR 之间的开源进程内桥梁。它建立在 JNI 和 PInvoke 之上。无需 C/C++ 代码。希望对你有帮助。

【讨论】:

以上是关于在不使用 COM 的情况下从 C++ 调用 C# 方法的主要内容,如果未能解决你的问题,请参考以下文章

C++ 在不知道子类型的情况下从父类型调用子方法

如何在不提供 C# 管理员凭据的情况下从标准用户启动进程

可以在不调用 memset 的情况下从构造函数初始化器列表中将成员结构设为零吗?

在 s-s-rS 中,是不是可以在不使用 C# 的情况下从主 rdl 循环一个子报表 rdl?

有啥简单的方法可以在不进行反序列化的情况下从 json 中找出最低值 c#

如何在不使用表单的情况下从 jsp 调用 servlet