1. 程式人生 > >Tag c++呼叫c#動態庫

Tag c++呼叫c#動態庫

有些時候,為了使用別人已經寫好的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);