Warum stimmen Cdecl-Aufrufe in der Standard-P / Invoke-Konvention häufig nicht überein?

Ich arbeite an einer ziemlich großen Codebasis, in der die C ++ - Funktionalität von C # aus P / Invoked ist.

In unserer Codebasis gibt es viele Aufrufe wie ...

C ++:

extern "C" int __stdcall InvokedFunction(int);

Mit einem entsprechenden C #:

[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
    private static extern int InvokedFunction(IntPtr intArg);

Ich habe das Netz (soweit ich dazu in der Lage bin) nach Gründen durchsucht, warum dieses offensichtliche Missverhältnis besteht. Warum gibt es beispielsweise einen Cdecl in C # und einen __stdcall in C ++? Dies führt anscheinend dazu, dass der Stapel zweimal gelöscht wird, aber in beiden Fällen werden Variablen in der gleichen umgekehrten Reihenfolge auf den Stapel verschoben, sodass ich keine Fehler sehe, obwohl die Möglichkeit besteht, dass die zurückgegebenen Informationen im Falle von gelöscht werden Versuch einer Ablaufverfolgung während des Debuggens?

Von MSDN:http://msdn.microsoft.com/en-us/library/2x8kf7zx%28v=vs.100%29.aspx

// explicit DLLImport needed here to use P/Invoke marshalling
[DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl,  CharSet = CharSet::Ansi)]

// Implicit DLLImport specifying calling convention
extern "C" int __stdcall MessageBeep(int);

Es gibt wieder beidesextern "C" im C ++ - Code undCallingConvention.Cdecl in der C#. Warum ist es nichtCallingConvention.Stdcall? Oder darüber hinaus, warum ist da__stdcall in der C ++?

Danke im Voraus!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage