C 名稱錯誤

C++編譯器以匯出函式的名稱(例如引數型別)編碼附加資訊,以使具有不同引數的過載成為可能。此過程稱為名稱修改 。這導致在 C#中匯入函式時出現問題(並且通常與其他語言互操作),因為 int add(int a, int b) 函式的名稱不再是 add,它可以是 ?add@@YAHHH@Z_add@8 或其他任何東西,具體取決於編譯器和呼叫約定。

有幾種方法可以解決名稱損壞的問題:

  • 使用 extern "C" 匯出函式切換到使用 C 名稱修改的 C 外部連結:

    extern "C" __declspec(dllexport) int __stdcall add(int a, int b)
    
    [DllImport("myDLL.dll")]
    

    函式名稱仍然會被修改(_add@8),但是 StdCall + extern "C" 名稱修改會被 C#編譯器識別。

  • myDLL.def 模組定義檔案中指定匯出的函式名稱:

    EXPORTS
      add
    
    int __stdcall add(int a, int b)
    
    [DllImport("myDLL.dll")]
    

    在這種情況下,函式名稱將是純 add

  • 匯入受損名稱。你需要一些 DLL 檢視器來檢視受損的名稱,然後你可以明確指定它:

    __declspec(dllexport) int __stdcall add(int a, int b)
    
    [DllImport("myDLL.dll", EntryPoint = "?add@@YGHHH@Z")]