Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ç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ı noktası kurallarındaki uyuşmazlıklar, alt düzey hata ayıklama becerileri gerektiren veri bozulmalarına ve ciddi çöküşlere 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 Cdecl çağırma kuralını kullanır. Bu kitaplıklarla birlikte çalışırken P/Invoke bildirimlerinde Cdecl çağırma kuralını açıkça belirtmek gerekir.
x86 olmayan mimariler için hem Stdcall hem de Cdecl çağırma kuralları standart platform varsayılan çağırma kuralı olarak değerlendirilir.
Çağırma kuralını ne zaman atlayabilirsiniz?
x64, ARM ve ARM64 mimarilerinde yalnızca bir çağrı kuralı vardır, bu nedenle açıkça birini belirtmek gereksizdir. Yalnızca Windows x86 (32 bit) hedeflendiğinde bir çağrı kuralı belirtmeniz gerekir; burada Stdcall ve Cdecl farklılık gösterir.
- ✔️ Windows x86'yı hedeflerken çağırma kurallarını açıkça belirtin.
- ✔️ DO, x64, ARM ve ARM64'te çağırma kuralını atlar; özniteliğin bu mimariler üzerinde hiçbir etkisi yoktur.
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 5'den önceki .NET Framework ve .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);