¿Por qué las llamadas Cdecl a menudo no coinciden en la Convención de invocación / P "estándar"?

Estoy trabajando en una base de código bastante grande en la que la funcionalidad C ++ es P / Invoked from C #.

Hay muchas llamadas en nuestro código base como ...

C ++:

extern "C" int __stdcall InvokedFunction(int);

Con un C # correspondiente:

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

He rastreado la red (en la medida en que soy capaz) para el razonamiento de por qué existe este aparente desajuste. Por ejemplo, ¿por qué hay un Cdecl dentro del C # y __stdcall dentro del C ++? Aparentemente, esto hace que la pila se borre dos veces, pero, en ambos casos, las variables se insertan en la misma pila en el mismo orden inverso, por lo que no veo ningún error, aunque existe la posibilidad de que la información de devolución se borre en el caso de intentando un seguimiento durante la depuración?

Desde 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);

Una vez más, hay dosextern "C" en el código C ++, yCallingConvention.Cdecl en la C#. Porque no lo esCallingConvention.Stdcall? O, además, ¿por qué está ahí?__stdcall en el C ++?

¡Gracias por adelantado!

Respuestas a la pregunta(2)

Su respuesta a la pregunta