"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > c#`cdecl`가 호출하고 c ++`__stdcall` 서명이 p/invoke에 공존하는 이유는 무엇입니까?

c#`cdecl`가 호출하고 c ++`__stdcall` 서명이 p/invoke에 공존하는 이유는 무엇입니까?

2025-03-24에 게시되었습니다
검색:519

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

c# cdecl 및 c __ stdcall p/insoke에서 공존에 대한 이유

C#과 C 사이의 상호 운용성을 호출하면 C# 함수가 cdecl 컨벤션을 사용하는 반면, 해당 함수는 __ stdcall 서명을 사용하는 경우가 종종 있습니다. 이 불일치는 역사적으로 오늘날까지 계속 된 콜 컨벤션 선택에서 비롯됩니다.

__ stdcall : Windows 함수의 발신자는

__ stdcall

16 비트 파스칼 호출 컨벤션에서 상속되며 Windows API 기능 및 com의 기본 호출 컨벤션입니다. Callee (호출되는 함수)가 실행 후 스택을 청소하여 자원으로 제한된 환경에서 더 컴팩트하게 만들도록 지정합니다. 그러나 발신자와 Callee가 예상하는 매개 변수의 수가 일치하지 않으면이 장점은 스택 불균형의 위험을 초래합니다.

__ cdecl

: 부패성 매개 변수 함수의 발신자 청소

] __ cdecl printf () scanf () 와 같은 가변 수의 매개 변수가있는 함수에 대한 C의 표준 호출 컨벤션입니다. 이 컨벤션은 발신자가 전달 된 매개 변수 수를 알고 있기 때문에 발신자에게 스택 청소에 대한 책임을집니다. callingconvention.cdecl

[dllimport]

선언을 지정하는 것이 일반적인 함정입니다. __ thiscall

: C 메소드 의이 포인터를 숨기고

__ thiscall 는 특별히 C를 말합니다.이 클래스의 인스턴스 방법 에서이 포인터를 전달하는 것을 처리합니다. __ cdecl 와 유사하지만 .NET P/Invoke Marshalling 핸들러는이를 지원하지 않으므로 Pinvoke C 코드에 적합하지 않습니다.

요약

cdecl 에서 c#에서 __ stdcall 서명의 공존은 이러한 역사적 전화 규칙과 각 언어 별 요구 사항의 결과입니다. 이러한 규칙에 대한 적절한 이해와 EntryPoint ExactSpelling 속성의 속성은 올바른 p/호출 기능을 보장하고 스택 불균형과 같은 잠재적 인 문제를 피하는 데 중요합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3