从C#调用C++代码是否可行?

99

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

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


未托管的C++转托管的C#:https://www.c-sharpcorner.com/uploadfile/tanmayit08/unmanaged-cpp-dll-call-from-managed-C-Sharp-application/ - Tyler S. Loeper
7个回答

102

在调用C++代码时,一种简单的方法是创建一个C++/CLI包装器程序集。 在C++/CLI中,您可以像编写本地代码一样调用非托管代码,但是您可以像调用C#编写的代码一样调用C++/CLI代码。该语言基本上是为将现有库与其他语言互操作而设计的。

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

请查看这篇博客文章以获取更加详细的示例。


4
博客文章的链接已损坏 :((The link for the blog post is broken.) - Vidar

11

P/Invoke是一项很好的技术,它的工作效果相当不错,但存在加载目标DLL文件的问题。我们发现做事情的最佳方式是创建一个本地函数的静态库,并将其链接到依赖于它的Managed C++(或C++/CLI)项目中。


我曾经遇到过回调和p/invoke的问题。转而使用C++ / CLI解决了这些问题。 - MedicineMan
在这种情况下,调试是如何工作的? - Yola

9

我不熟悉你提到的库,但是一般有几种方法可以实现:

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

6

2
当然没问题。可以通过这篇文章开始入门。
我们使用P/Invoke在Windows移动设备上从C#实现此功能。

2

用于实现这一功能的技术称为P/Invoke,您可以搜索相关文章了解更多。请注意,它是用于从C#调用C而不是C++,因此您需要将C++代码封装在一个导出到DLL的C包装器中。


-3

Apache Thrift - “Thrift是一种接口定义语言和二进制通信协议,用于为众多编程语言定义和创建服务。” - Peter Mortensen
那个回答如何回答问题?它本质上只是一个链接式的回答。你能否用自己的话详细解释一下你的回答?请通过编辑(更改)你的回答来回应,而不是在评论中回应(不要加上“编辑:”,“更新:”或类似的内容——回答应该看起来像是今天写的)。 - Peter Mortensen
好的,OP可能已经离开了 (“上次出现超过1年前”) - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接