用託管類庫的方式在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個問題)
相關文章
- PDF 檔案編寫器 C# 類庫(版本 1.28.0)使用詳解C#
- 使用C++/CLI呼叫C#封裝類庫C++C#封裝
- c++模板類的使用,編譯的問題C++編譯
- 從C++看C#託管記憶體與非託管記憶體C++C#記憶體
- C++中的容器類C++
- 使用Chatgpt編寫的PHP資料庫pdo操作類(增刪改查)ChatGPTPHP資料庫
- 談談Java常用類庫中的設計模式 - Part ⅠJava設計模式
- MFC之動態呼叫自己寫的類庫中的類的成員方法
- C++有理數類設計C++
- Arthas 使用的各類方式
- 如何把遺留的Java應用託管在Service Fabric中Java
- C#中URL的操作類C#
- C++ 類别範本的寫法C++
- Python類的基礎--設計、使用Python
- 重學c#系列——c# 託管和非託管資源(三)C#
- Python中的類超程式設計Python程式設計
- Aop 設計 - 使用 PHP-parser 重寫 PHP 類PHP
- toLua中Lua呼叫C#中的類C#
- 編寫表DAO類
- C# - 非同步程式設計 - BackgroundWorker 類C#非同步程式設計
- Gartner:預計到2022年75%的資料庫將託管在雲端資料庫
- 【基礎題】【類】類的設計思路
- 用 GoLang 編寫類似 Apache Camel 路由引擎GolangApache路由
- Java庫中的LocalDate類JavaLDA
- Java列舉類在生產環境中的使用方式Java
- python中calss(類)的使用,類的教程,類中的函式怎麼呼叫。Python函式
- C#中的擴充套件類的理解C#套件
- c#中的委託C#
- 使用了Buzz庫的HttpClient類來設定代理HTTPclient
- 多執行緒程式設計進階——Java類庫中的鎖執行緒程式設計Java
- java工具類編寫思考Java
- 在 NGINX 上託管 Angular 應用程式的終極指南NginxAngular
- java併發程式設計:Thread類的使用Java程式設計thread
- [Go語言寫介面]三、使用介面設計器設計視窗,在程式碼中呼叫,背景編輯器的使用Go
- 文字圖Tranformer在文字分類中的應用ORM文字分類
- .NET Standard 類庫的使用技巧
- C++ 類的大小C++
- C++的代理類C++