C# 和 C++ 是兩種非常流行的程式語言,每種語言都有其獨特的優勢和適用場景。有時,我們可能需要在C#計畫中呼叫C++編寫的DLL(動態連結庫)。這種跨語言呼叫可以透過平台呼叫(P/Invoke)或者C++/CLI等技術實作。本文將詳細介紹如何在C#中呼叫C++ DLL。
步驟一:建立C++ DLL
首先,我們需要一個C++ DLL。以下是一個簡單的C++ DLL範例,它包含一個名為
AddNumbers
的函式,該函式接收兩個整數參數並返回它們的和。
C++ DLL程式碼(AddNumbers.cpp):
extern"C" __declspec(dllexport) intAddNumbers(int a, int b){
return a + b;
}
為了編譯這個DLL,你需要一個C++編譯器,如MSVC。將上述程式碼保存為
AddNumbers.cpp
,然後使用以下命令編譯:
cl /LD AddNumbers.cpp
這將生成一個名為
AddNumbers.dll
的DLL檔。
步驟二:在C#中聲明DLL函式
接下來,在C#計畫中,我們需要聲明一個與C++ DLL中函式簽名匹配的委托。這允許C#程式碼呼叫DLL中的函式。
C#程式碼(Program.cs):
using System;
using System.Runtime.InteropServices;
classProgram {
// 聲明與C++ DLL中函式簽名匹配的委托
[DllImport("AddNumbers.dll", CallingConvention = CallingConvention.Cdecl)]
publicstaticexternintAddNumbers(int a, int b);
staticvoidMain() {
// 呼叫C++ DLL中的函式
int result = AddNumbers(2, 3);
Console.WriteLine("The result is: " + result);
}
}
在上面的程式碼中,
DllImport
內容告訴C#編譯器從名為
AddNumbers.dll
的DLL中匯入一個名為
AddNumbers
的函式。
CallingConvention.Cdecl
指定了C++函式的呼叫約定。
步驟三:編譯和執行C#程式碼
最後,編譯並執行C#程式碼。確保C#計畫能夠找到C++ DLL檔。你可以將DLL檔放在C#計畫的輸出目錄中,或者將其路徑添加到系統的PATH環境變量中。
編譯並執行C#計畫後,你應該能夠在控制台上看到輸出
The result is: 5
,這是C++ DLL中
AddNumbers
函式返回的結果。
註意事項
名稱修飾(Name Mangling): C++支持函式多載,因此編譯器會為每個多載函式生成一個唯一的名稱(透過名稱修飾)。為了確保C#能夠正確找到並呼叫C++函式,我們需要使用
extern "C"
來阻止C++編譯器對函式名進行名稱修飾。呼叫約定(Calling Convention): C++和C#使用不同的呼叫約定。在上面的範例中,我們使用了
CallingConvention.Cdecl
,這是C++中最常見的呼叫約定之一。確保在C#和C++中使用相同的呼叫約定。DLL路徑(DLL Path): 確保C#計畫能夠找到C++ DLL檔。你可以將DLL檔放在C#計畫的輸出目錄中,或者將其路徑添加到系統的PATH環境變量中。
透過這些步驟,你可以在C#中成功呼叫C++ DLL,實作跨語言編程。