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