【发布时间】:2010-10-30 10:58:14
【问题描述】:
是否可以从 .NET 语言(如 C#)中调用可能编译为代码库文件 (.dll) 的 C++ 代码?
特别是 C++ 代码,例如 RakNet 网络库。
【问题讨论】:
-
非托管 c++ 到托管 c#:c-sharpcorner.com/uploadfile/tanmayit08/…
标签: c# .net c++ unmanaged managed
是否可以从 .NET 语言(如 C#)中调用可能编译为代码库文件 (.dll) 的 C++ 代码?
特别是 C++ 代码,例如 RakNet 网络库。
【问题讨论】:
标签: c# .net c++ unmanaged managed
调用 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();
查看this blog post 了解更多解释示例。
【讨论】:
P/Invoke 是一项不错的技术,它运行良好,除了加载目标 DLL 文件时出现问题。我们发现最好的方法是创建本地函数的静态库并将其链接到依赖它的托管 C++(或 C++/CLI)项目。
【讨论】:
我不熟悉你提到的库,但总的来说有几种方法:
【讨论】:
【讨论】:
当然是。 This article 是一个很好的例子,说明你可以做一些事情来开始这件事。
我们在 Windows Mobile 设备上使用 C# 执行此操作,使用 P/Invoke。
【讨论】:
用于执行此操作的技术称为P/Invoke;您可以搜索有关该主题的文章。请注意,它是用于从 C# 调用 C,而不是 C++。因此,您需要将 C++ 代码包装在 DLL 导出的 C 包装器中。
【讨论】:
【讨论】: