Я работаю над довольно большой базой кода, в которой функциональность С++ P/Вызывается из С#.
В нашей кодовой базе есть много вызовов, таких как...
С++:
extern "C" int __stdcall InvokedFunction(int);
С соответствующим С#:
[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
private static extern int InvokedFunction(IntPtr intArg);
Я подсчитал сеть (насколько я могу) рассуждать о том, почему это кажущееся несоответствие существует. Например, почему существует Cdecl внутри С# и __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"
, так и CallingConvention.Cdecl
в С#. Почему это не CallingConvention.Stdcall
? Или, более того, почему существует __stdcall
в С++?
Спасибо заранее!