Почему вызовы 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
в С ++?
Заранее спасибо!