1. 程式人生 > >C++呼叫C#庫(DLL)

C++呼叫C#庫(DLL)

一、工作環境

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檔案 放在一個資料夾下。
在這裡插入圖片描述