在c#中创建非托管c ++对象

我有一个非托管的dll,里面有一个“MyClass”类。 现在有没有办法用C#代码创建这个类的实例? 要调用它的构造函数? 我尝试过,但是visual studio会报告错误,并显示该内存区域已损坏或其他内容。

提前致谢

C#无法创建从本机Dll导出的类实例。 你有两个选择:

  1. 创建C ++ / CLI包装器。 这是.NET类库,可以作为对任何其他.NET项目的引用添加。 在内部,C ++ / CLI类使用非托管类,通过标准C ++规则链接到本机Dll。 对于.NET客户端,此C ++ / CLI类看起来像.NET类。

  2. 编写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); 

这就是全部。