Zakázané zařazování za běhu

Při použití atributu System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute na sestavení modul runtime zakáže většinu integrované podpory pro zařazování dat mezi spravovanými a nativními reprezentacemi. Tento článek popisuje funkce, které jsou zakázané a jak se typy .NET mapují na nativní typy při zařazování.

Scénáře, kdy je zařazování zakázané

DisableRuntimeMarshallingAttribute Při použití na sestavení ovlivňuje typy P/Invokes a Delegate v sestavení a také všechna volání nespravovaných ukazatelů funkce v sestavení. Nemá vliv na žádné typy delegátů volání nespravovaného kódu ani zprostředkovatele komunikace definované v jiných sestaveních. Také nezakazuje zařazování pro integrovanou podporu zprostředkovatele komunikace modelu COM modulu runtime. Integrovanou podporu zprostředkovatele komunikace modelu COM je možné povolit nebo zakázat prostřednictvím přepínače funkcí.

Zakázané funkce

DisableRuntimeMarshallingAttribute Při použití na sestavení nebudou mít následující atributy žádný vliv ani nevyvolají výjimku:

  • LCIDConversionAttribute při volání nebo delegátu
  • SetLastError=true při volání nespravovaného kódu
  • ThrowOnUnmappableChar=true při volání nespravovaného kódu
  • BestFitMapping=true při volání nespravovaného kódu
  • Podpisy metody argumentu .NET variadic (varargs)
  • in, , refout parametry

Výchozí pravidla pro zařazování běžných typů

Při zařazování je zakázáno, pravidla pro výchozí zařazování se změní na mnohem jednodušší pravidla. Tato pravidla jsou popsaná níže. Jak je uvedeno v dokumentaci k osvědčeným postupům spolupráce, typy blittable jsou typy se stejným rozložením ve spravovaném a nativním kódu a proto nevyžadují žádné zařazování. Tato pravidla se navíc nedají přizpůsobit pomocí nástrojů uvedených v dokumentaci k přizpůsobení zařazování parametrů.

Klíčové slovo jazyka C# Typ .NET Nativní typ
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 na volání nedochází k žádnému efektu)
nint System.IntPtr intptr_t
nuint System.UIntPtr uintptr_t
System.Boolean bool
Typ jazyka C# unmanaged definovaný uživatelem bez políLayoutKind.Auto Považováno za blittable typ. Všechny přizpůsobené zařazování struktur se ignorují.
Všechny ostatní typy Nepodporovaný

Příklady

Následující příklad ukazuje některé funkce, které jsou povoleny nebo zakázány při zařazování za běhu je zakázáno:

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