Por que as chamadas Cdecl são muitas vezes incompatíveis na Convenção P / Convocatória “padrão”?

Eu estou trabalhando em uma base de código bastante grande em que a funcionalidade de C ++ é P / Invocada de c #.

Existem muitas chamadas na nossa base de código, como ...

C ++:

extern "C" int __stdcall InvokedFunction(int);

Com um correspondente C #:

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

Eu vasculhei a rede (na medida em que sou capaz) pelo raciocínio a respeito de porque essa aparente incompatibilidade existe. Por exemplo, por que há um Cdecl dentro do C # e __stdcall dentro do C ++? Aparentemente, isso resulta na pilha sendo limpa duas vezes, mas, em ambos os casos, as variáveis ​​são colocadas na pilha na mesma ordem reversa, de modo que eu não vejo nenhum erro, embora a possibilidade de que as informações de retorno sejam apagadas no caso de tentando um rastreamento durante a depuração?

Do MSDN:http://msdn.microsoft.com/pt-br/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);

Mais uma vez, há tantoextern "C" no código C ++ eCallingConvention.Cdecl no c #. Por que não é isso?CallingConvention.Stdcall? Ou, além disso, por que há__stdcall no C ++?

Desde já, obrigado!