C++呼叫C#庫(DLL)
阿新 • • 發佈:2018-12-28
一、工作環境
1.平 臺:Windows 10 (64位)
2.軟體環境:VS2013
3.項 目:MFC
二、C++呼叫C#庫(DLL)
1.準備C#庫 (Dll檔案)
1.1 建立C#類庫
1.2 實現C#程式碼
//C#程式碼 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ClassLibrary { public class MyClass { public String returnString() { return "I am from C#"; } } }
1.3 配置C#庫工程並生成庫
2. 準備MFC工程
2.1 建立MFC專案
2.2 CLR支援(公共語言執行支援)
2.3 引用和呼叫C#庫
// 標頭檔案中對C#庫及名稱空間的引用 #using "../Debug/ClassLibrary.dll" using namespace ClassLibrary; using namespace System; //下面用到System下的String (c#中名稱空間) //.cpp ClassLibrary::MyClass ^myClass = gcnew MyClass(); //對C#中類進行例項 String^ string = myClass->returnString(); //呼叫C#中方法 CString str = (CString)string; //強制型別轉換 GetDlgItem(IDC_EDIT1)->SetWindowText(str); //在編輯框中顯示文字
##補充說明:
如果將C#的類定義成C++類的成員變數;
那麼要用gcroot,例如:
// 在.h中 private: gcroot<ClassLibrary::MyClass^> *myclass = new gcroot<ClassLibrary::MyClass^>; //在函式中使用C#類變數 (*myclass) = gcnew ClassLibrary::MyClass; String^ string = (*myclass)->returnString(); //呼叫C#中方法 CString str = (CString)string; GetDlgItem(IDC_EDIT1)->SetWindowText(str);
2.4 執行結果
3其他補充說明
3.1 為什麼使用gcnew 而不使用 new ?
C++/CLI中使用 gcnew 關鍵字用來表示 在託管堆上分配記憶體,並且區分其他指標的區別,使用 ^ 來代替 * 作為指標含義, 語義上大致如下:
(1)、gcnew返回的是一個控制代碼(handle), 而new 返回的是實際的記憶體地址
(2)、gcnew建立的物件由虛擬機器託管,而new建立的物件必須自己來管理和釋放
在此不是有C++本身來分配記憶體空間,而是由其他虛擬機器託管分配,並且不需要C++程式來釋放空間
3.2 使用#using 巨集引入dll庫檔案, 而不是 #pragma comment(lib, “”)
後面主要用於引入C/C++庫檔案
3.3 執行時可能會出現以下問題
主要是由於exe程式載入的dll檔案不存在或未找到,可以:
將 C#的庫檔案和pdb檔案 與 C++的編譯程式exe和pdb檔案 放在一個資料夾下。