我們在代碼實作過程中有時候需要提高性能或者通路底層API,我們可以通過在C#中調用C語言函數而達到解決問題需求,這樣不僅可以充分發揮C語言的優勢,提高應用程式的性能、通路底層API、實作跨平台相容性,并重用現有的C語言代碼。最近剛剛有這樣的實作案例,我整理如何實作C#調用C語言程式集過程作為一個示例參考,希望能幫助到大家。
建立C語言并生成DLL
首先我們建立在Visual Studio中編寫C語言并生成DLL,我們可以按照以下步驟進行操作:
- 打開Visual Studio,并選擇"建立新項目"。
- 在模闆選擇界面,選擇"Win32"類别,并選擇"Win32控制台應用程式"模闆。給你的項目命名,并選擇儲存的位置。
- 在"應用程式類型"對話框中,選擇"DLL"選項,并確定"空項目"選項被選中。然後點選"确定"。
- 在解決方案資料總管中,右鍵點選你的項目,選擇"添加" -> "建立項"。
- 在"添加新項"對話框中,選擇"C++檔案(.cpp)"選項,并給你的檔案命名。然後點選"添加"。
- 在打開的C++檔案中,編寫你的C語言代碼。例如,你可以定義一個函數并實作它。這裡我們實作一個C語言的休眠方法和一個HelloWord兩個方法。
#include <stdio.h>
#include <Windows.h>
void sleep_microseconds(int microseconds) {
LARGE_INTEGER frequency;
LARGE_INTEGER start;
LARGE_INTEGER end;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&start);
while (1) {
QueryPerformanceCounter(&end);
if (((end.QuadPart - start.QuadPart) * 1000000 / frequency.QuadPart) >= microseconds) {
break;
}
}
}
__declspec(dllexport) void sleep_five_microseconds() {
sleep_microseconds(3* 1000000);
}
__declspec(dllexport) void HelloWorld()
{
printf("Hello, World!\n");
}
7.在解決方案資料總管中,右鍵點選你的項目,選擇"屬性"。
8.在屬性視窗中,選擇"配置屬性" -> "正常"。在"配置類型"下拉菜單中,選擇"動态庫(.dll)"。
9.在"配置屬性" -> "C/C++" -> "正常"中,確定"附加包含目錄"設定包含你所需的頭檔案路徑。
10.在"配置屬性" -> "連結器" -> "輸入"中,添加你的DLL依賴項。這些依賴項可能是其他的C語言庫檔案。
11.點選"應用"并關閉屬性視窗。
12.建構你的項目,可以通過點選Visual Studio工具欄上的"生成"按鈕或使用快捷鍵Ctrl + Shift + B。
13.編譯dll後,我們使用Developer Command Prompt工具,輸入如下指令檢視程式集方法
dumpbin /exports sleepmicrosecondstest.dll
至此看到我們預期的方法,說明我們編譯的C語言程式集沒有問題。接下來我們拷貝dll到我們C#項目的bin檔案夾下面,實作C#語言調用C語言。
實作C#調用C語言
我們随便建立一個C#控制台程式,在C#中調用C語言DLL,可以使用DllImport特性來導入DLL中的函數。以下是一個簡單的示例。
[DllImport("sleepmicrosecondstest.dll")]
public static extern void sleep_five_microseconds();
[DllImport("sleepmicrosecondstest.dll")]
public static extern void HelloWorld();
static void Cdll()
{
Console.WriteLine(#34;[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff")}] 調用了C語言函數方式");
Console.WriteLine(#34;[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff")}] 調用了C語言函數方式");
sleep_five_microseconds();
HelloWorld();
Console.WriteLine(#34;[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff")}] 調用了C語言函數 5微秒");
}
需要注意的是,你需要将sleepmicrosecondstest.dll替換為你實際生成的DLL檔案的名稱。另外,如果C語言函數有參數或傳回值,你需要在C#中進行相應的聲明和類型轉換。
此外,還需要確定DLL檔案位于正确的位置,以便C#程式可以找到并加載它。通常情況下,DLL檔案需要與C#可執行檔案位于同一目錄中(如debug下面是:項目路徑\bin\Debug\net6.0),或者将DLL檔案添加到系統路徑中。
執行個體結果
運作代碼示例,結果如圖所示:
以上通過完整的執行個體示範C#調用C語言的整個過程和步驟,總之通過在C#中調用C語言函數,你可以利用C語言的強大功能來擴充C#的功能或者提升性能。歡迎大家一起讨論C#語言的各種神奇操作。