94

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

具体来说,诸如 RakNet 网络库之类的 C++ 代码。

4

7 回答 7

97

调用 C++ 的一种简单方法是在 C++/CLI 中创建包装程序集。在 C++/CLI 中,您可以像编写本机代码一样调用非托管代码,但您可以从 C# 调用 C++/CLI 代码,就好像它是用 C# 编写的一样。该语言基本上被设计为与现有库的互操作,作为其“杀手级应用程序”。

例如 - 使用 /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();

查看此博客文章以获取更多解释的示例。

于 2009-06-01T16:56:26.953 回答
10

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

于 2009-06-01T16:55:32.803 回答
9

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

  • P/Invoke到导出的库函数
  • 添加对 COM 类型库的引用(以防您处理 COM 对象)。
于 2009-06-01T16:50:38.050 回答
5

是的,它被称为P/Invoke

这是一个很好的资源站点,用于将它与 Win32 API 一起使用:

http://www.pinvoke.net/

于 2009-06-01T16:54:20.370 回答
2

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

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

于 2009-06-01T16:49:10.457 回答
2

用于执行此操作的技术称为P/Invoke;您可以搜索有关该主题的文章。请注意,它是用于从 C# 调用 C,而不是 C++。因此,您需要将 C++ 代码包装在 DLL 导出的 C 包装器中。

于 2009-06-01T16:51:54.650 回答
-2

你考虑过 Apache Thrift 吗?

http://thrift.apache.org/

这似乎是一个非常巧妙的解决方案。

于 2010-11-25T19:39:00.077 回答