C# P/Invoke 호출 규칙 충돌 이해: Cdecl 대 Stdcall
플랫폼 호출(P/Invoke)은 관리형(C#) 코드와 비관리형(예: C ) 코드를 연결합니다. 그러나 호출 규칙의 불일치로 인해 상호 운용성 문제가 발생할 수 있습니다.
문제의 원인
충돌은 C와 C#의 기본 P/Invoke 설정 간의 호출 규칙 처리가 다르기 때문에 발생합니다.
__stdcall
규칙을 사용합니다. 호출된 함수(callee
)는 스택 정리를 담당합니다.CallingConvention.Winapi
이며, Windows에서는 __stdcall
과 동일합니다.주요 호출 규칙의 차이점:
핵심 차이점은 다음과 같습니다.
__stdcall
와 C#의 CallingConvention.Winapi
(또는 CallingConvention.Stdcall
)__cdecl
(C에서 자주 사용됨)에는 스택을 정리하기 위한 호출 함수(caller
)가 필요합니다. __stdcall
은 이를 callee
에 할당합니다.잘못된 P/Invoke 선언 예:
C 함수가 CallingConvention.Cdecl
을 사용할 때 잘못된 C# 선언에서 __stdcall
을 사용할 수 있습니다. 이로 인해 스택 손상 및 런타임 오류가 발생합니다.
올바른 C# 선언:
호환성을 보장하려면 C# DllImport
속성이 C 함수의 규칙과 일치해야 합니다.
<code class="language-csharp">[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Winapi)] private static extern int InvokedFunction(IntPtr intArg);</code>
대회 불일치 방지:
항상 관리되지 않는 함수의 호출 규칙을 확인하고 이를 C# DllImport
선언에 정확하게 반영하세요. 지원되는 호출 규칙에 대한 자세한 내용은 Microsoft 설명서를 참조하세요.
위 내용은 C# P/Invoke에서 CDECL 및 STDCALL Calling Conventions Mismatch가 불일치하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!