Pourquoi Cdecl appelle souvent incompatibles dans la “norme” de P/Invoke Convention?

Je suis en train de travailler sur une assez grande base de code en C++ fonctionnalité est P/Invoquée à partir de C#.

Il y a de nombreux appels dans notre base de code, tels que...

C++:

extern "C" int __stdcall InvokedFunction(int);

Avec un C# correspondant:

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

J'ai écumé le net (dans la mesure où je suis capable) pour le raisonnement pour expliquer pourquoi cette apparente incompatibilité existe. Par exemple, pourquoi est-il Cdecl dans le C#, et __ _ _ stdcall dans le C++? Apparemment, cette résultats dans la pile étant éliminé à deux reprises, mais, dans les deux cas, les variables sont poussés sur la pile dans le même ordre inverse, de telle sorte que je ne vois pas d'erreurs, mais la possibilité que le retour d'information est désactivée en cas de tentative de trace au cours de débogage?

À partir de 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);

Une fois de plus, il est à la fois extern "C" dans le code C++, et CallingConvention.Cdecl dans le C#. Pourquoi n'est-il pas CallingConvention.Stdcall? Ou, d'ailleurs, pourquoi est-il __stdcall dans le C++?

Merci d'avance!