«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему C# `cdecl` и C ++` __stdcall` signatures сосуществуют в P/Invoke?

Почему C# `cdecl` и C ++` __stdcall` signatures сосуществуют в P/Invoke?

Опубликовано в 2025-03-24
Просматривать:769

Why Do C# `Cdecl` Calls and C   `__stdcall` Signatures Coexist in P/Invoke?

c# cdecl и c __ stdcall причины сосуществования в p/vink

в p/invoke совместимость между C# и C, часто случается, что функции C# Используют

cdecl Calling Convent, в то время как их c -соответствующие функции используют сигнатуру __ stdcall . Это несоответствие связано с выбором конвенции о вызове, который исторически продолжался по сей день. ]

__ stdcall : функция Caller of Windows очищает ]

__ stdcall наследует от 16-битной конвенции о вызове Паскаля и является соглашением о вызове по умолчанию для функций Windows API и com. В нем указывается, что Callee (вызывающаяся функция) очищает стек после выполнения, что делает его более компактным в условиях, ограниченных ресурсами. Однако, если количество параметров, ожидаемых вызывающим абонентом и Callee, не совпадает, это преимущество представляет риск дисбаланса стека. ]

__ CDECL : Caller Очистка функции изменяемого параметра ]]

__ cdecl - стандартная конвенция о вызове в C для функций с переменным количеством параметров, таких как printf () и scanf () . Эта конвенция возлагает ответственность за очистку стека на вызывающего абонента, потому что вызывающий абонент знает, что количество пройденных параметров. Забыл указать callconvention.cdecl в [dllimport] ] Объявление в C# является обычной ловушкой. ]

__ thiscall : скрыть этот указатель метода C ]]]

__ thisCall специфически относится к C, который обрабатывает передачу Hidden this указатели в методе экземпляра класса. Это похоже на __ CDECL , но .NET P/invoke Marshalling Handler не поддерживает его и, следовательно, не подходит для кода Pinvoke C. ]

Summarize Сосуществование

cdecl

вызывает в C# и __ stdcall подпись в C является результатом этих исторических вызовов и каждой зависимости от требований к конкретному языку. Правильное понимание этих соглашений, а также intrypoint и expling свойства имеют решающее значение для обеспечения правильной функции p/вызовы и избежать потенциальных проблем, таких как дисбаланс стека. ]

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3