Aracılığıyla paylaş


Çalışma zamanında verilerin dönüştürülmesi 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.

Serilemenin 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 yönlendirmeyi 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 bir temsilci kullanılarak
  • SetLastError=true P/Invoke üzerinde
  • ThrowOnUnmappableChar=true P/Invoke üzerinde
  • BestFitMapping=true P/Invoke üzerinde
  • .NET varyatif bağımsız değişkenli yöntem 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 uygulama belgelerinde belirtildiği gibi, blittable türler yönetilen ve yerel kodda aynı düzene sahip olduğu için herhangi bir dönüştürme gerektirmez. Ayrıca, bu kurallar parametre hazırlamayı özelleştirme belgelerinde belirtilen araçlarla özelleştirilemez.

C# anahtar sözcüğü .NET Türü Yerel Tip
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 Bellekte doğrudan kopyalanabilir bir tür olarak değerlendirilir. Tüm özelleştirilmiş yapı aktarımı yoksayılır.
Diğer tüm türler Desteklenmeyen

Ö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 [DllImport] özniteliği yerine [LibraryImport] özniteliğini kullanır. Kimliği SYSLIB1054 olan çözümleyici, [LibraryImport] kullandığınızda 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