在不使用 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# 方法的主要内容,如果未能解决你的问题,请参考以下文章
可以在不调用 memset 的情况下从构造函数初始化器列表中将成员结构设为零吗?
在 s-s-rS 中,是不是可以在不使用 C# 的情况下从主 rdl 循环一个子报表 rdl?