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")]