Yönetilmeyen çağrı kuralları
Çağırma kuralları , yöntem bağımsız değişkenlerinin ve dönüş değerlerinin çağıran ile çağrılan yöntem arasında nasıl geçirildiğini gösteren alt düzey ayrıntıları açıklar.
P/Invoke bildiriminde bildirilen yönetilmeyen çağrı kuralının yerel uygulama tarafından kullanılan yönetilmeyen çağrı kuralıyla eşleşmesi önemlidir. Yönetilmeyen çağrı kurallarındaki uyuşmazlıklar, tanılamak için düşük düzey hata ayıklama becerileri gerektiren veri bozulmalarına ve önemli kilitlenmelere yol açar.
Platform varsayılan çağırma kuralı
Çoğu platform kurallı bir çağrı kuralı kullanır ve çoğu durumda açıkça belirtilen bir çağrı kuralı gereksizdir.
x86 mimarisi için varsayılan çağırma kuralı platforma özgüdür. Stdcall
("standart çağrı"), Windows x86'da varsayılan çağrı kuralıdır ve çoğu Win32 API'sinde kullanılır. Cdecl
, Linux x86'da varsayılan çağırma kuralıdır. Unix kaynaklı açık kaynak kitaplıkların Windows bağlantı noktaları genellikle Windows x86'da bile çağırma kuralını kullanır Cdecl
. Bu kitaplıklarla birlikte çalışma için P/Invoke bildirimlerinde çağırma kuralını açıkça belirtmek Cdecl
gerekir.
x86 olmayan mimariler için hem hem Cdecl
de Stdcall
çağırma kuralları kurallı platform varsayılan çağırma kuralı olarak değerlendirilir.
Yönetilen P/Invoke bildirimlerinde çağırma kurallarını belirtme
Çağırma kuralları, ad alanı içindeki System.Runtime.CompilerServices
türlere veya bunların birleşimlerine göre belirtilir:
- Callconvcdecl
- Callconvfastcall
- CallConvMemberFunction
- Callconvstdcall
- CallConvsuppressGCTransition
- Callconvthiscall
Açıkça belirtilen çağrı kuralları örnekleri:
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();
Önceki .NET sürümlerinde çağırma kurallarını belirtme
.NET Framework ve .NET 5 öncesi .NET sürümleri, CallingConvention numaralandırması tarafından açıklanan çağrı kurallarının bir alt kümesiyle sınırlıdır.
Açıkça belirtilen çağrı kuralları örnekleri:
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);