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:

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);

Ayrıca bkz.