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