Aracılığıyla paylaş


Çalışma zamanı hazırlama devre dışı bırakıldı

System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute Öznitelik bir derlemeye uygulandığında, çalışma zamanı yönetilen ve yerel gösterimler arasında veri hazırlama için en yerleşik desteği devre dışı bırakır. Bu makalede, devre dışı bırakılan özellikler ve .NET türlerinin, sıralama devre dışı bırakıldığında yerel türlerle nasıl eşlenmesi açıklanmaktadır.

Sıralamanın devre dışı bırakıldığı senaryolar

DisableRuntimeMarshallingAttribute bir derlemeye uygulandığında, derlemedeki P/Invoke'ları ve Temsilci türlerini ve derlemedeki yönetilmeyen işlev işaretçilerine yapılan çağrıları etkiler. Diğer derlemelerde tanımlanan hiçbir P/Invoke veya birlikte çalışma temsilcisi türünü etkilemez. Ayrıca çalışma zamanının yerleşik COM birlikte çalışma desteği için sıralamayı devre dışı bırakmaz. Yerleşik COM birlikte çalışma desteği bir özellik anahtarı aracılığıyla etkinleştirilebilir veya devre dışı bırakılabilir.

Devre dışı bırakılan özellikler

DisableRuntimeMarshallingAttribute bir derlemeye uygulandığında, aşağıdaki özniteliklerin hiçbir etkisi olmaz veya özel durum oluşturmaz:

  • LCIDConversionAttribute P/Invoke veya temsilci üzerinde
  • SetLastError=true P/Invoke üzerinde
  • ThrowOnUnmappableChar=true P/Invoke üzerinde
  • BestFitMapping=true P/Invoke üzerinde
  • .NET variadic bağımsız değişken yöntemi imzaları (varargs)
  • in, ref, out parametreler

Ortak türleri sıralamak için varsayılan kurallar

Sıralama devre dışı bırakıldığında, varsayılan sıralama kuralları çok daha basit kurallara dönüşür. Bu kurallar aşağıda açıklanmıştır. Birlikte çalışma en iyi yöntemleri belgelerinde belirtildiği gibi, kesilebilir türler yönetilen ve yerel kodda aynı düzene sahip türlerdir ve bu nedenle herhangi bir sıralama gerektirmez. Ayrıca, bu kurallar parametre hazırlamayı özelleştirme belgelerinde belirtilen araçlarla özelleştirilemez.

C# anahtar sözcüğü .NET Türü Yerel Tür
byte System.Byte uint8_t
sbyte System.SByte int8_t
short System.Int16 int16_t
ushort System.UInt16 uint16_t
int System.Int32 int32_t
uint System.UInt32 uint32_t
long System.Int64 int64_t
ulong System.UInt64 uint64_t
char System.Char char16_t (CharSet P/Invoke üzerinde hiçbir etkisi yoktur)
nint System.IntPtr intptr_t
nuint System.UIntPtr uintptr_t
System.Boolean bool
Alanları olmayan kullanıcı tanımlı C# unmanaged türü LayoutKind.Auto Kesilebilir bir tür olarak değerlendirilir. Tüm özelleştirilmiş yapı hazırlaması yoksayılır.
Diğer tüm türler Desteklenme -yen

Örnekler

Aşağıdaki örnekte çalışma zamanı hazırlama devre dışı bırakıldığında etkinleştirilen veya devre dışı bırakılan bazı özellikler gösterilmektedir. Bu kılavuzun el ile uygulanmasını göstermek için, bu örnekler önerilen [LibraryImport] özniteliğin aksine kullanır[DllImport]. Kimlik SYSLIB1054 sahip çözümleyici, kullanırken [LibraryImport]ek yönergeler sağlar.

using System.Runtime.InteropServices;

struct Unmanaged
{
    int i;
}

[StructLayout(LayoutKind.Auto)]
struct AutoLayout
{
    int i;
}

struct StructWithAutoLayoutField
{
    AutoLayout f;
}

[UnmanagedFunctionPointer] // OK: UnmanagedFunctionPointer attribute is supported
public delegate void Callback();

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] // OK: Specifying a calling convention is supported
public delegate void Callback2(int i); // OK: primitive value types are allowed

[DllImport("NativeLibrary", EntryPoint = "CustomEntryPointName")] // OK: Specifying a custom entry-point name is supported
public static extern void Import(int i);

[DllImport("NativeLibrary", CallingConvention = CallingConvention.Cdecl)] // OK: Specifying a custom calling convention is supported
public static extern void Import(int i);

[UnmanagedCallConv(new[] { typeof(CallConvCdecl) })] // OK: Specifying a custom calling convention is supported
[DllImport("NativeLibrary")]
public static extern void Import(int i);

[DllImport("NativeLibrary", EntryPoint = "CustomEntryPointName", CharSet = CharSet.Unicode, ExactSpelling = false)] // OK: Specifying a custom entry-point name and using CharSet-based lookup is supported
public static extern void Import(int i);

[DllImport("NativeLibrary")] // OK: Not explicitly specifying an entry-point name is supported
public static extern void Import(Unmanaged u); // OK: unmanaged type

[DllImport("NativeLibrary")] // OK: Not explicitly specifying an entry-point name is supported
public static extern void Import(StructWithAutoLayoutField u); // Error: unmanaged type with auto-layout field

[DllImport("NativeLibrary")]
public static extern void Import(Callback callback); // Error: managed types are not supported when runtime marshalling is disabled