用託管類庫的方式在C#中使用C++編寫的類(設計流程)
用託管類庫的方式在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個問題)
相關文章
- 介面在託管C++中的應用 (轉)C++
- 《C++ API 設計》——寫給想寫好類庫的程式設計師C++API程式設計師
- 託管與非託管的混合程式設計程式設計
- C#中基類的重寫C#
- 在Laravel中使用自己的類庫三種方式Laravel
- C++中的連結串列類的設計C++
- PDF 檔案編寫器 C# 類庫(版本 1.28.0)使用詳解C#
- 使用C++/CLI呼叫C#封裝類庫C++C#封裝
- C#中類的使用舉例C#
- c++模板類的使用,編譯的問題C++編譯
- C++:關於委託類C++
- 從C++看C#託管記憶體與非託管記憶體C++C#記憶體
- 如何把遺留的Java應用託管在Service Fabric中Java
- C++中的容器類C++
- c++ 中的集合類C++
- C++中類的sizeofC++
- 從jQuery 入口方式寫jQuery工具類庫jQuery
- C#呼叫c++編寫的dllC#C++
- C++中類及類的定義 (轉)C++
- C# 託管資源和非託管資源C#
- MFC之動態呼叫自己寫的類庫中的類的成員方法
- 在C#中使用C/C++寫的DLL (轉)C#C++
- 談談Java常用類庫中的設計模式 - Part ⅠJava設計模式
- 重學c#系列——c# 託管和非託管資源(三)C#
- C++有理數類設計C++
- 使用Chatgpt編寫的PHP資料庫pdo操作類(增刪改查)ChatGPTPHP資料庫
- C#中URL的操作類C#
- C#中類的繼承C#繼承
- C#網站呼叫C++非託管dll須知C#網站C++
- 設計模式中類的關係設計模式
- 使用c++中string類的注意事項C++
- C++ 類别範本的寫法C++
- C++基礎::類設計的幾大原則C++
- mapreduce 程式設計SequenceFile類的使用程式設計
- Stella 知識庫--模型類的設計模型
- xUtils類庫的使用
- Python各類影象庫的圖片讀寫方式總結Python
- toLua中Lua呼叫C#中的類C#