2012-02-09 90 views
3
**unmanaged class** 

這也是非託管類的聲明調用C++ DLL從C#

#ifdef EXPORT_CLASS 
#define DLL_EXPORT __declspec(dllexport) 
#else 
#define DLL_EXPORT __declspec(dllimport) 
#endif 
public class DLL_EXPORT cppclass 
{ 
private: 
string x; 
public: 
cppclass(); 
~cppclass(); 
string native(); 
}; 


**UNMANAGED CLASS DEFINITION** 

這是不受管理的類定義

cppclass::cppclass() 
{ 
x="hello"; 
}; 
cppclass::~cppclass() 
{ 
}; 
string cppclass::native() 
{ 
return x; 
}; 

**MANAGED CLASS** 

這是管理類的聲明

public __gc class Mclass 
{ 
//private: 
public: 
cppclass * obj; 
public: 
Mclass(); 
~Mclass(); 
string native(); 

};

**MANAGED CLASS DEFINITION** 

//這是管理類定義

#include"managed.h" 
Mclass::Mclass() 
{ 
    obj=new cppclass(); 
}; 
Mclass::~Mclass() 
{ 
    delete obj; 
}; 
string Mclass::native() 
{ 
return obj->native(); 
}; 

所有這四個文件是在它被做成一個dll.Now如何在C#項目中使用它的一個項目

+2

該片段非常不完整。 Mclass必須聲明爲「public ref class」,以便在程序集外可見。你*必須*實現一個終結器,所以當客戶端代碼不調用Dispose()時你不會泄漏內存。你的native()方法應該檢查* obj *是否沒有被刪除。 – 2012-02-09 13:11:44

+0

@HansPassant:你的幫助是高度讚賞....將嘗試發佈完整的片段在未來的清晰.... – 2012-02-09 14:25:02

+2

關鍵是要做*現在*,而不是下一次。 – 2012-02-09 14:38:48

回答

1

這整件事情是一場災難。這不是C++/CLI代碼,它是破舊的舊版C++託管擴展。另外,從DLL導出本地類是一個非常糟糕的主意。靜態鏈接您的本機代碼與託管類定義,創建一個DLL。

+0

對此感到抱歉......本地代碼和託管類定義一起在一個項目中,它們共同創建一個dll – 2012-02-10 04:56:17

+0

@Manu:好的,那很好。你應該摧毀所有的'EXPORT_CLASS'和'__declspec(dllexport)'東西,然後它只是乞求某人打開它並造成麻煩。 – 2012-02-10 13:10:23

+0

感謝Ben ....正在工作......感謝您的幫助 – 2012-02-10 14:13:29

5

在C#項目中添加對DLL的引用,並像使用任何.NET類型一樣簡單地使用它。 也許你在DLL中找不到任何導出的類型,因爲這些必須是公開的。

編輯:BTW。我希望你在談論C++/CLI,而不是C++/CLI之前的託管C++。

+0

雖然AFAIK不需要在名稱空間中,但類別 – Botz3000 2012-02-09 12:12:30

+0

@ Botz3000:你是對的 - 我糾正了我的答案。 – Simon 2012-02-09 12:15:49

+0

@Simon y我正在談論C++/CLI.Can請詳細說明一下示例 – 2012-02-09 12:40:07