用託管類庫的方式在C#中使用C++編寫的類(設計流程)

mington197804發表於2019-03-06

用託管類庫的方式在C#中使用C++編寫的類(設計流程)

對於C++編寫的匯出類(DLL動態連結庫,輸出符號),可用託管類庫的方式在C#中使用。當然,C#也可以呼叫C++的dll中的函式(非採用呼叫類的成員函式的方法),但靈活性較差。
對於C#使用匯出C++類時,需要完成三部分程式設計(參考“一”中的1):
(1)C++類的程式設計實現:建立Win32型別的Win32專案(可以是控制檯程式,在設定專案時需選擇”輸出符號”),需編譯可生成非託管的動態連結庫(NativeDll.dll和NativeDll.lib)。
關鍵點:因為生成dll時需要同時匯出lib檔案,在標頭檔案中需有如下巨集定義
#ifndef LX_DLL_CLASS_EXPORTS
#define LX_DLL_CLASS __declspec(dllexport) //後面類的定義中有使用到LX_DLL_CLASS
#else
#define LX_DLL_CLASS __declspec(dllimport)
#endif
此外,對於需要匯出的類,需要在定義類時在類名前加上LX_DLL_CLASS:
class LX_DLL_CLASS 匯出類名
{ };
此外:專案“屬性”->“C/C++”->“程式碼生成”中的“執行庫”,如果選擇“多執行緒DLL”的話,則程式碼中不允許出現cout等螢幕輸出語句,另外,要求所有類的所有函式都要有定義。此外,如果類中不能有vector型別的子物件。選擇“多執行緒DLL除錯”的話,則不受上述約束,但生成的dll可能不合適。
(2)託管類庫的程式設計實現:建立CLR型別的類庫專案。設定VC++的目錄之庫目錄,使之包含NativeDll.lib所在的目錄,在聯結器-輸入-附加依賴項中,新增庫NativeDll.lib。需要將(1)中C++類的標頭檔案(介面定義)include到本專案中;最好把(1)中生成的動態連結庫存到當前專案的工作目錄下。處理方法是:用託管C++將(1)所實現的C++類給封裝一下,然後再提供給C#來使用。編譯執行,即可生成託管的類庫(ManageCppDll.dll)
關鍵點:需要(1)所生成的dll為“多執行緒DLL”的執行庫。
(3)C#型別的Windows專案(可以為控制檯應用程式):通過(2)生成的託管類庫來使用(1)實現的類。需要在專案中(引用)新增託管類庫ManageCppDll.dll的引用,然後按託管類的正常使用方式即可呼叫ManageCppDll中的類的屬性和方法。
關鍵點:將(1)、(2)中生成的dll和lib檔案都拷貝到C#資料夾的bin/debug下,再在專案中的“引用”新增託管類庫ManageCppDll.dll(2中生成的dll)的引用。

可能出現的問題:
release編譯好的兩個dll拷貝到C#資料夾的bin/debug後,c#工程編譯出錯問題(問題1:無效的程式;問題2:找不到指定模組)。
解決辦法:(1)編譯兩個dll時需設定為x86目標平臺,編譯C#工程也是如此;(解決第1個問題)
(2)如果要編譯release版的C#工程,因為設為x86目標平臺,因此,兩個dll檔案應該拷貝到C#工程資料夾的bin/x86/release下;如編譯debug版本,則拷貝到bin/x86/debug下。(解決第2個問題)

相關文章