C# Language Calling conventions


There're several conventions of calling functions, specifying who (caller or callee) pops arguments from the stack, how arguments are passed and in what order. C++ uses Cdecl calling convention by default, but C# expects StdCall, which is usually used by Windows API. You need to change one or the other:

  • Change calling convention to StdCall in C++:

    extern "C" __declspec(dllexport) int __stdcall add(int a, int b)
  • Or, change calling convention to Cdecl in C#:

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

If you want to use a function with Cdecl calling convention and a mangled name, your code will look like this:

__declspec(dllexport) int add(int a, int b)
[DllImport("myDLL.dll", CallingConvention = CallingConvention.Cdecl,
           EntryPoint = "?add@@YAHHH@Z")]
  • thiscall(__thiscall) is mainly used in functions that are members of a class.

  • When a function uses thiscall(__thiscall) , a pointer to the class is passed down as the first parameter.