當前位置: 妍妍網 > 碼農

在C#中呼叫C++ DLL(動態連結庫)

2024-02-11碼農

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(23);
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 函式返回的結果。

註意事項

  1. 名稱修飾(Name Mangling): C++支持函式多載,因此編譯器會為每個多載函式生成一個唯一的名稱(透過名稱修飾)。為了確保C#能夠正確找到並呼叫C++函式,我們需要使用 extern "C" 來阻止C++編譯器對函式名進行名稱修飾。

  2. 呼叫約定(Calling Convention): C++和C#使用不同的呼叫約定。在上面的範例中,我們使用了 CallingConvention.Cdecl ,這是C++中最常見的呼叫約定之一。確保在C#和C++中使用相同的呼叫約定。

  3. DLL路徑(DLL Path): 確保C#計畫能夠找到C++ DLL檔。你可以將DLL檔放在C#計畫的輸出目錄中,或者將其路徑添加到系統的PATH環境變量中。

透過這些步驟,你可以在C#中成功呼叫C++ DLL,實作跨語言編程。