在c#中创建非托管c ++对象
我有一个非托管的dll,里面有一个“MyClass”类。 现在有没有办法用C#代码创建这个类的实例? 要调用它的构造函数? 我尝试过,但是visual studio会报告错误,并显示该内存区域已损坏或其他内容。
提前致谢
C#无法创建从本机Dll导出的类实例。 你有两个选择:
-
创建C ++ / CLI包装器。 这是.NET类库,可以作为对任何其他.NET项目的引用添加。 在内部,C ++ / CLI类使用非托管类,通过标准C ++规则链接到本机Dll。 对于.NET客户端,此C ++ / CLI类看起来像.NET类。
-
编写C ++类的C包装器,.NET客户端可以使用PInvoke。 例如,过度简化的C ++类:
class MyClass() { 上市: MyClass(int n){data = n;} 〜MyClass的(){} int GetData(){return data;} 私人的: int数据; };
此类的C API包装器:
void * CreateInstance() { MyClass * p = new MyClass(); 返回p; } void ReleaseInstance(void * pInstance) { MyClass * p =(MyClass *)pInstance; 删除p; } int GetData(void * pInstance) { MyClass * p =(MyClass *)pInstance; return p-> GetData(); } //为每个MyClass公共方法编写包装函数。 //每个包装函数的第一个参数应该是类实例。
CreateInstance,ReleaseInstance和GetData可以使用PInvoke在C#客户端声明,并直接调用。 void *参数应在PInvoke声明中声明为IntPtr。
您不能直接在C#中使用未管理的C ++代码。 可以使用PInvoke完成互操作性。 有许多与此主题相关的问题 ,尤其是在调用具有指针作为参数的函数时。
基本程序如下:
C#部分
namespace MyNamespace { public class Test { [DllImport("TheNameOfThe.dll")] public static extern void CreateMyClassInstance(); public void CallIt() { CreateMyClassInstance(); // calls the unmanged function via PInvoke } } }
C ++部分
class MyClass { public: MyClass() { /** Constructor */ } }; MyClass* staticObject; extern "C" void CreateMyObjectInstance() { staticObject = new MyClass(); // constructor is called }
解决方案是创建C ++ / CLI包装器,如:
#include "DllExportClass.h" public ref class ManagedOperationHelper { public: double Sum(double add1, double add2) { CDllExportClass obj; double ret=obj.Sum(add1, add2); return ret; } double Mult(double mult1, double mult2) { CDllExportClass obj; double ret=obj.Mult(mult1, mult2); return ret; } };
其中CDllExportClass是从本机代码导出的类。 以上是C ++ / CLI的.h。 注意让lib找到这个dll。 将dll和lib放在同一目录中并编译C ++ / CLI代码。在托管代码目录中放置本机dll和C ++ / CLI dll。 在托管项目中放入C ++ / CLI项目的引用。 在C ++ / CLI类的maged代码中实现如下:
ManagedOperationHelper obj = new ManagedOperationHelper(); double ret=obj.Sum(10, 20);
这就是全部。