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