문제 해결 c# p/호출 컨벤션 불일치
이 기사에서는 C#과 C 코드를 상호 작용하기 위해 플랫폼 호출 (p/invoke)을 사용할 때 일반적인 문제를 설명합니다. 우리는 불일치 한 전화 규칙의 문제에 초점을 맞출 것입니다 : in c# versus c.
전화 컨벤션이
32 비트 환경에서는 컨벤션 호출 매개 변수 통과, 스택 스토리지 및 정리를 지시합니다. 주요 컨벤션은 다음과 같습니다
CallingConvention.Cdecl
: __stdcall
발신자는 인수를 추진합니다. 칼리는 스택을 청소합니다. Windows Apis 및 Com에서 사용합니다
: 발신자는 인수를 밀고 스택을 청소합니다. C.의 표준
: 는 일부 인수에 대한 레지스터를 사용하여 속도를 향상 시키지만 호환성을 줄입니다.
: 와 유사하지만 C 멤버 함수의 "이"포인터를 처리합니다.
: - 관리 된 통화 컨벤션 밸런싱 요소는 스택 문제를 방지합니다.
__stdcall
코드 예제 분석
C 함수를 고려하십시오 :
및 그 c# p/호출 대응 :
-
컨벤션 충돌
문제는 c#의
__cdecl
에서 에서 상충되는 에서 비롯됩니다. 이것은 스택 불균형으로 이어집니다. 는 종종 p/invoke 기본값 (Windows API 유병률로 인해)이지만 C 코드와의 인터페이스에는 명시적인 규칙 사양이 필요합니다.
해상도 -
솔루션은 간단합니다. C# 통화 규칙을 C ONE : 정렬합니다.
__fastcall
키 테이크 아웃
전화 컨벤션을 이해하는 것은 성공적인 교차 외과성에 필수적입니다. 일치하는 규칙은 스택 오류를 방지하고 원활한 C# 및 C 통합을 보장합니다.
위 내용은 c# p/가 callyvention.cdecl '으로 호출을 호출하는 이유는 왜 c`__stdcall` 기능을 호출 할 때 실패합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!