Tag c++呼叫c#動態庫
阿新 • • 發佈:2019-01-27
有些時候,為了使用別人已經寫好的C#庫檔案,我們需要使用C++呼叫C#庫檔案; 以下做了一簡單的呼叫工程,步驟如下:
1、準備C#庫 (dll檔案)第一步:單擊"檔案"---->"新建專案"---->"類圖"---->"確認";
第二步:在類裡寫個簡單的方法;
第三步:在"解決方案"右鍵,選擇"生成解決方案B";
在Debug資料夾下回產生一個dll檔案
2、建立c++工程
第一步:單擊"解決方案"---->"新增"---->"新建專案"---->"空專案"
第二步:右擊新專案,點選屬性,如圖:雙擊公共語言執行支援(clr)
第三步:在c++原始檔裡,引入c#動態庫和呼叫類,如圖:
第四步:編譯執行c++專案;
可能會出現這種錯誤,如圖:
主要是由於exe程式載入的dll檔案不存在或未找到,可以: 將C#的庫檔案和pdb檔案 輸出到一個公共的資料夾下,讓c#的庫檔案和pdb檔案和將C++的編譯程式exe和pdb檔案放在一起; 引用c#庫的路徑一定要對 最後補充說明 1)為什麼使用gcnew 而不使用 new ? C++/CLI中使用 gcnew 關鍵字用來表示 在託管堆上分配記憶體,並且區分其他指標的區別,使用 ^ 來代替 * 作為指標含義, 語義上大致如下: (1)、gcnew返回的是一個控制代碼(handle), 而new 返回的是實際的記憶體地址 (2)、gcnew建立的物件由虛擬機器託管,而new建立的物件必須自己來管理和釋放 在此不是由C++本身來分配記憶體空間,而是由其他虛擬機器託管分配,並且不需要C++程式來釋放空間 2)在clr裡將c#將System::string轉為char*和wchar_t * : 呼叫名稱空間System::Runtime::InteropServices中的類Marshal的StringToHGlobalAnsi()函式或者StringToHGlobalUni()函式轉換為需要的char*或者wchar_t*字串。char* szRet = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str1); wchar_t *wszRet = (wchar_t*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalUni(str1);