天天看點

如何實作C#調用C語言程式集

作者:碼上盡寶

我們在代碼實作過程中有時候需要提高性能或者通路底層API,我們可以通過在C#中調用C語言函數而達到解決問題需求,這樣不僅可以充分發揮C語言的優勢,提高應用程式的性能、通路底層API、實作跨平台相容性,并重用現有的C語言代碼。最近剛剛有這樣的實作案例,我整理如何實作C#調用C語言程式集過程作為一個示例參考,希望能幫助到大家。

如何實作C#調用C語言程式集

建立C語言并生成DLL

首先我們建立在Visual Studio中編寫C語言并生成DLL,我們可以按照以下步驟進行操作:

  1. 打開Visual Studio,并選擇"建立新項目"。
  2. 在模闆選擇界面,選擇"Win32"類别,并選擇"Win32控制台應用程式"模闆。給你的項目命名,并選擇儲存的位置。
  3. 在"應用程式類型"對話框中,選擇"DLL"選項,并確定"空項目"選項被選中。然後點選"确定"。
  4. 在解決方案資料總管中,右鍵點選你的項目,選擇"添加" -> "建立項"。
  5. 在"添加新項"對話框中,選擇"C++檔案(.cpp)"選項,并給你的檔案命名。然後點選"添加"。
  6. 在打開的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)"。

如何實作C#調用C語言程式集

9.在"配置屬性" -> "C/C++" -> "正常"中,確定"附加包含目錄"設定包含你所需的頭檔案路徑。

10.在"配置屬性" -> "連結器" -> "輸入"中,添加你的DLL依賴項。這些依賴項可能是其他的C語言庫檔案。

11.點選"應用"并關閉屬性視窗。

12.建構你的項目,可以通過點選Visual Studio工具欄上的"生成"按鈕或使用快捷鍵Ctrl + Shift + B。

13.編譯dll後,我們使用Developer Command Prompt工具,輸入如下指令檢視程式集方法

dumpbin /exports sleepmicrosecondstest.dll           
如何實作C#調用C語言程式集

至此看到我們預期的方法,說明我們編譯的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語言的強大功能來擴充C#的功能或者提升性能。歡迎大家一起讨論C#語言的各種神奇操作。

繼續閱讀