Почему вызовы Cdecl часто не совпадают в «стандартной» конвенции P / Invoke?

Я работаю над довольно большой кодовой базой, в которой функциональность C ++ вызывается из C #.

В нашей кодовой базе много вызовов, таких как ...

C ++:

extern "C" int __stdcall InvokedFunction(int);

С соответствующим C #:

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

Я обыскивал сеть (насколько я способен), чтобы понять, почему существует такое явное несоответствие. Например, почему в C # есть Cdecl, а в C ++ __stdcall? Очевидно, это приводит к тому, что стек очищается дважды, но в обоих случаях переменные помещаются в стек в том же обратном порядке, так что я не вижу никаких ошибок, хотя существует вероятность того, что возвращаемая информация очищается в случае пытаться отследить во время отладки?

Из 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);

Еще раз, есть обаextern "C" в коде C ++, иCallingConvention.Cdecl в C #. Почему нетCallingConvention.Stdcall? Или, кроме того, почему там__stdcall в С ++?

Заранее спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос