Dlaczego wywołania Cdecl często są niezgodne w „standardowej” konwencji P / Invoke?

Pracuję nad dość dużą bazą kodu, w której funkcjonalność C ++ jest P / Invoked z C #.

W naszym kodzie źródłowym jest wiele połączeń, takich jak ...

C ++:

extern "C" int __stdcall InvokedFunction(int);

Z odpowiednim C #:

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

Przeszukałem sieć (o ile jestem w stanie) w celu wyjaśnienia, dlaczego ta pozorna niezgodność istnieje. Na przykład, dlaczego istnieje Cdecl w C # i __stdcall w C ++? Najwyraźniej powoduje to dwukrotne czyszczenie stosu, ale w obu przypadkach zmienne są wypychane na stos w tej samej kolejności odwrotnej, że nie widzę żadnych błędów, chociaż możliwość, że informacje zwrotne zostaną wyczyszczone w przypadku próba śledzenia podczas debugowania?

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

Po raz kolejny jest jedno i drugieextern "C" w kodzie C ++ iCallingConvention.Cdecl w C #. Dlaczego tak nie jestCallingConvention.Stdcall? Albo zresztą dlaczego tam jest__stdcall w C ++?

Z góry dziękuję!

questionAnswers(2)

yourAnswerToTheQuestion