簡體   English   中英

在C#中創建非托管C ++對象

[英]Create unmanaged c++ object in 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()
    {
    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.

可以使用PInvoke在C#客戶端中聲明CreateInstance,ReleaseInstance和GetData,然后直接調用它們。 void *參數應在PInvoke聲明中聲明為IntPtr。

解決方案是創建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。 注意讓我們找到該dll的lib。 將dll和lib放在同一目錄中並編譯C ++ / CLI代碼。在托管代碼目錄中,將本機dll和C ++ / CLI dll放入。 在托管項目中,放入C ++ / CLI項目的引用。 通過以下代碼實例化C ++ / CLI類:

ManagedOperationHelper obj = new ManagedOperationHelper();
double ret=obj.Sum(10, 20);  

就是這樣

您不能直接在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
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM