召集会议

调用函数有几种约定,指定谁(调用者或被调用者)从堆栈中弹出参数,如何传递参数以及按什么顺序传递参数。C++默认使用 Cdecl 调用约定,但 C#需要 StdCall,它通常由 Windows API 使用。你需要改变一个或另一个:

  • 在 C++中将调用约定更改为 StdCall

    extern "C" __declspec(dllexport) int __stdcall add(int a, int b)
    
    [DllImport("myDLL.dll")]
    
  • 或者,在 C#中将调用约定更改为 Cdecl

    extern "C" __declspec(dllexport) int /*__cdecl*/ add(int a, int b)
    
    [DllImport("myDLL.dll", CallingConvention = CallingConvention.Cdecl)]
    

如果你想使用 Cdecl 调用约定和一个错位名称的函数,你的代码将如下所示:

__declspec(dllexport) int add(int a, int b)
[DllImport("myDLL.dll", CallingConvention = CallingConvention.Cdecl,
           EntryPoint = "?add@@YAHHH@Z")]
  • thiscall__ thishisall )主要用于作为类成员的函数。

  • 当函数使用 thiscall__ thishisall )时,指向该类的指针将作为第一个参数传递。