P/Invoke에서 C# cdecl
과 C__stdcall
가 공존하는 이유
C#과 C 간의 P/Invoke 상호 운용성에서 C# 함수는 cdecl
호출 규칙을 사용하는 반면 C 함수는 __stdcall
서명을 사용하는 경우가 많습니다. 이러한 불일치는 역사적으로 오늘날까지 지속되어 온 콜링 컨벤션 선택에서 비롯됩니다.
__stdcall
: Windows 기능의 호출자 정리
__stdcall
16비트 Pascal 호출 규칙을 상속하며 Windows API 함수 및 COM에 대한 기본 호출 규칙입니다. 호출 수신자(호출되는 함수)가 실행 후 스택을 정리하도록 제공하여 리소스가 제한된 환경에서 스택을 더욱 컴팩트하게 만듭니다. 그러나 이 이점은 호출자와 호출 수신자가 예상하는 인수 수가 일치하지 않는 경우 스택 불균형의 위험이 있습니다.
__cdecl
: 가변 함수의 호출자 정리
__cdecl
은 printf()
및 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!