> 백엔드 개발 > C++ > C# `Cdecl` 호출과 C `__stdcall` 서명이 P/Invoke에 공존하는 이유는 무엇입니까?

C# `Cdecl` 호출과 C `__stdcall` 서명이 P/Invoke에 공존하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-25 23:41:10
원래의
348명이 탐색했습니다.

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

P/Invoke에서 C# cdecl과 C__stdcall가 공존하는 이유

C#과 C 간의 P/Invoke 상호 운용성에서 C# 함수는 cdecl 호출 규칙을 사용하는 반면 C 함수는 __stdcall 서명을 사용하는 경우가 많습니다. 이러한 불일치는 역사적으로 오늘날까지 지속되어 온 콜링 컨벤션 선택에서 비롯됩니다.

__stdcall: Windows 기능의 호출자 정리

__stdcall 16비트 Pascal 호출 규칙을 상속하며 Windows API 함수 및 COM에 대한 기본 호출 규칙입니다. 호출 수신자(호출되는 함수)가 실행 후 스택을 정리하도록 제공하여 리소스가 제한된 환경에서 스택을 더욱 컴팩트하게 만듭니다. 그러나 이 이점은 호출자와 호출 수신자가 예상하는 인수 수가 일치하지 않는 경우 스택 불균형의 위험이 있습니다.

__cdecl: 가변 함수의 호출자 정리

__cdeclprintf()scanf()과 같이 가변 개수의 인수가 있는 함수에 대한 C의 표준 호출 규칙입니다. 이 규칙은 호출자가 전달된 인수 수를 알고 있으므로 스택 정리에 대한 책임을 호출자에게 맡깁니다. C#의 [DllImport] 선언에서 CallingConvention.Cdecl을 지정하는 것을 잊어버리는 것은 일반적인 함정입니다.

__thiscall: C 메소드의 이 포인터를 숨겼습니다

__thiscall은 특히 C를 참조하며 클래스의 인스턴스 메서드에서 숨겨진 this 포인터 전달을 처리하는 데 사용됩니다. __cdecl과 유사하지만 .NET P/Invoke 마샬러에서 지원하지 않으므로 pinvoke C 코드와 함께 사용하기에는 적합하지 않습니다.

요약

C#의

호출과 C의 cdecl 서명이 공존하는 것은 이러한 역사적인 호출 규칙과 각 언어의 특정 요구 사항의 결과입니다. __stdcall[DllImport]EntryPoint 특성뿐만 아니라 이러한 규칙을 올바르게 이해하는 것은 올바른 P/Invoke 기능을 보장하고 스택 불균형과 같은 잠재적인 문제를 방지하는 데 중요합니다. ExactSpelling

위 내용은 C# `Cdecl` 호출과 C `__stdcall` 서명이 P/Invoke에 공존하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿