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óduThrowOnUnmappableChar=true
při volání nespravovaného kóduBestFitMapping=true
při volání nespravovaného kódu- Podpisy metody argumentu .NET variadic (varargs)
in
, ,ref
out
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. K předvedení ručního použití těchto pokynů se tyto příklady používají [DllImport]
místo doporučeného [LibraryImport]
atributu. Analyzátor s ID SYSLIB1054 poskytuje další pokyny při použití [LibraryImport]
.
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