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ę!