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