Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Aanroepende conventies beschrijven details op laag niveau voor de manier waarop methodeargumenten en retourwaarden worden doorgegeven tussen de aanroeper en de aangeroepen methode.
Het is belangrijk dat de niet-beheerde oproepconventie die is gedeclareerd in een P/Invoke-declaratie overeenkomt met de niet-beheerde oproepconventie die wordt gebruikt door de systeemeigen implementatie. Niet-overeenkomende overeenkomsten in niet-beheerde oproepconventies leiden tot beschadigingen van gegevens en fatale crashes waarvoor foutopsporingsvaardigheden op laag niveau nodig zijn om diagnoses uit te voeren.
Standaard oproepconventie voor platforms
De meeste platforms gebruiken één canonieke belconventie en een expliciet opgegeven belconventie is in de meeste gevallen overbodig.
Voor de x86-architectuur is de standaardaanroepconventie platformspecifiek.
Stdcall ("standaardaanroep") is de standaardconventie voor aanroepen op Windows x86 en wordt gebruikt door de meeste Win32-API's.
Cdecl is de standaardconventie voor aanroepen in Linux x86. Windows poorten van opensource-bibliotheken die afkomstig zijn van Unix, gebruiken vaak de Cdecl oproepconventie, zelfs op Windows x86. Het is nodig om expliciet de Cdecl aanroepconventie op te geven in P/Invoke-declaraties voor interop met deze bibliotheken.
Voor niet-x86-architecturen worden zowel Stdcall als Cdecl aanroepconventies behandeld als de standaard aanroepconventie voor het desbetreffende platform.
Wanneer u de oproepconventie weglaat
In x64-, ARM- en ARM64-architecturen is er slechts één oproepconventie, dus het expliciet opgeven van een conventie is niet nodig. U hoeft alleen een oproepconventie op te geven bij het instellen van Windows x86 (32-bits), waarbij Stdcall en Cdecl verschillen.
- ✔️ Geef de aanroepconventie expliciet op wanneer je Windows x86 target.
- ✔️ Laat de aanroepconventie voor x64, ARM en ARM64 weg: het kenmerk heeft geen effect op deze architecturen.
Aanroepconventies opgeven in beheerde P/Invoke-declaraties
De aanroepende conventies worden opgegeven door typen in de System.Runtime.CompilerServices naamruimte of de bijbehorende combinaties:
- CallConvCdecl
- CallConvFastcall
- CallConvMemberFunction
- CallConvStdcall
- CallConvSuppressGCTransition
- CallConvThiscall
Voorbeelden van expliciet opgegeven belconventies:
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
// P/Invoke declaration using SuppressGCTransition calling convention.
[LibraryImport("kernel32.dll")]
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSuppressGCTransition) })]
extern static ulong GetTickCount64();
// Unmanaged callback with Cdecl calling convention.
[UnmanagedCallersOnly(CallConvs = new Type[] { typeof(CallConvCdecl) })]
static unsafe int NativeCallback(void* context);
// Method returning function pointer with combination of Cdecl and MemberFunction calling conventions.
static unsafe delegate* unmanaged[Cdecl, MemberFunction]<int> GetHandler();
Oproepconventies opgeven in eerdere .NET versies
.NET Framework- en .NET-versies vóór .NET 5 zijn beperkt tot een subset aanroepende conventies die kunnen worden beschreven door de opsomming CallingConvention.
Voorbeelden van expliciet opgegeven belconventies:
using System.Runtime.InteropServices;
// P/Invoke declaration using Cdecl calling convention
[DllImport("ucrtbase.dll", CallingConvention=CallingConvention.Cdecl)]
static void* malloc(UIntPtr size);
// Delegate marshalled as callback with Cdecl calling convention
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void Callback(IntPtr context);