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

Evg*_*007 12 .net c# c++ unmanaged

我有一个非托管的dll,里面有一个"MyClass"类.现在有没有办法用C#代码创建这个类的实例?要调用它的构造函数?我试过了,但是visual studio报告了一个错误消息,指出这个内存区域已损坏或有什么东西.

提前致谢

Ale*_*x F 21

C#无法创建从本机Dll导出的类实例.您有两种选择:

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

  2. 编写C++类的C包装器,.NET客户端可以使用PInvoke.例如,过度简化的C++类:


    class MyClass()
    {
    public:
        MyClass(int n){data=n;}
        ~MyClass(){}
        int GetData(){return data;}
    private:
        int data;
    };

此类的C API包装器:


    void* CreateInstance()
    {
        MyClass* p = new MyClass();
        return p;
    }

    void ReleaseInstance(void* pInstance)
    {
        MyClass* p = (MyClass*)pInstance;
        delete p;
    }

    int GetData(void* pInstance)
    {
        MyClass* p = (MyClass*)pInstance;
        return p->GetData();
    }

    // Write wrapper function for every MyClass public method.
    // First parameter of every wrapper function should be class instance.

CreateInstance,ReleaseInstance和GetData可以使用PInvoke在C#客户端声明,并直接调用.void*参数应在PInvoke声明中声明为IntPtr.