可能从C#调用C ++代码?

是否有可能从.NET语言(如C#)中调用可能编译为代码库文件(.dll)的C ++代码?

特别是C ++代码,如RakNetnetworking库。

调用C ++的一个简单方法是在C ++ / CLI中创build一个包装程序集。 在C ++ / CLI中,您可以调用非托pipe代码,就好像您正在编写本机代码一样,但是您可以从C#调用C ++ / CLI代码,就好像它是用C#编写的一样。 该语言基本上是与现有的图书馆互为“杀手级应用程序”devise的。

例如 – 用/ clr开关编译

#include "NativeType.h" public ref class ManagedType { NativeType* NativePtr; public: ManagedType() : NativePtr(new NativeType()) {} ~ManagedType() { delete NativePtr; } void ManagedMethod() { NativePtr->NativeMethod(); } }; 

然后在C#中,添加对您的ManagedType程序集的引用,并像这样使用它:

 ManagedType mt = new ManagedType(); mt.ManagedMethod(); 

看看这个博客文章的更多解释的例子。

我不熟悉你提到的图书馆,但总的来说有两种方法可以这样做:

  • P /调用导出的库函数
  • 添加对COMtypes库的引用(如果你正在处理COM对象)。

P / Invoke是一个很好的技术,除了加载目标DLL文件的问题之外,它工作得很好。 我们发现,最好的方法是创build一个静态的本地函数库,并将其链接到依赖于它的托pipeC ++(或C ++ / CLI)项目中。

是的,它被称为P / Invoke 。

这里有一个很好的资源网站,用于Win32 API:

http://www.pinvoke.net/

当然是。 这篇文章是一个很好的例子,你可以开始做这件事。

我们使用P / Invoke从Windows Mobile设备上的C#执行此操作。

用来做这件事的技术被称为P / Invoke ; 你可以search关于这个主题的文章。 请注意,它是从C#调用C,而不是C ++。 所以你需要将你的C ++代码封装在你的DLL导出的C封装器中。

你有没有考虑Apache Thrift?

http://thrift.apache.org/

这似乎是一个非常非常整洁的解决scheme。