Letiltott futtatókörnyezeti rendezés

Amikor az System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute attribútumot egy szerelvényre alkalmazza, a futtatókörnyezet letiltja a felügyelt és natív reprezentációk közötti adatrendezés beépített támogatását. Ez a cikk ismerteti a letiltott funkciókat, és azt, hogy a .NET-típusok hogyan képeznek natív típusokat a rendezés letiltásakor.

Forgatókönyvek, ahol a rendezés le van tiltva

Amikor a rendszer egy DisableRuntimeMarshallingAttribute szerelvényre alkalmazza a szerelvényt, az hatással van a szerelvény P/Invokes és Delegált típusára, valamint a nem felügyelt függvénymutatók hívására a szerelvényben. Ez nem érinti a más szerelvényekben definiált P/Invoke vagy interop delegálttípusokat. Emellett nem tiltja le a futtatókörnyezet beépített COM-interop-támogatásának beállítását. A beépített COM interop-támogatás funkciókapcsolóval engedélyezhető vagy letiltható.

Letiltott funkciók

Ha a rendszer egy DisableRuntimeMarshallingAttribute szerelvényre alkalmazza a szerelvényt, a következő attribútumok nem lesznek hatással, vagy kivételt okoznak:

  • LCIDConversionAttribute P/Invoke vagy meghatalmazott esetén
  • SetLastError=true P/Invoke rendszeren
  • ThrowOnUnmappableChar=true P/Invoke rendszeren
  • BestFitMapping=true P/Invoke rendszeren
  • .NET variadikus argumentummetódus-aláírások (varargs)
  • in, refparaméterek out

A gyakori típusok rendezési szabályai

Ha a rendezés le van tiltva, az alapértelmezett rendezési szabályok sokkal egyszerűbb szabályokra változnak. Ezeket a szabályokat az alábbiakban ismertetjük. Ahogy az ajánlott eljárások közötti dokumentációban is említettük, a titkos típusok olyan típusok, amelyek elrendezése megegyezik a felügyelt és a natív kódban, és mint ilyen, nem igényelnek rendezést. Ezen kívül ezek a szabályok nem szabhatók testre a paraméter-rendezés testreszabásáról szóló dokumentációban említett eszközökkel.

C# kulcsszó .NET-típus Natív típus
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 a P/Invoke nincs hatással)
nint System.IntPtr intptr_t
nuint System.UIntPtr uintptr_t
System.Boolean bool
Felhasználó által definiált C# unmanaged típus mező nélkül LayoutKind.Auto Titkos adattípusként kezelve. A rendszer figyelmen kívül hagyja az összes testre szabott szerkezet-rendezést .
Minden más típus Támogatott

Példák

Az alábbi példa néhány olyan funkciót mutat be, amelyek engedélyezve vannak vagy le vannak tiltva, ha a futtatókörnyezet-rendezés le van tiltva:

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