Marshalling di runtime disabilitato

Quando l'attributo System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute viene applicato a un assembly, il runtime disabilita la maggior parte del supporto predefinito per il marshalling dei dati tra rappresentazioni gestite e native. Questo articolo descrive le funzionalità disabilitate e il mapping dei tipi .NET ai tipi nativi quando il marshalling è disabilitato.

Scenari in cui il marshalling è disabilitato

Quando l'oggetto DisableRuntimeMarshallingAttribute viene applicato a un assembly, influisce sui tipi P/Invoke e Delegate nell'assembly, nonché sulle chiamate ai puntatori a funzioni non gestite nell'assembly. Non influisce sui tipi P/Invoke o delegati dell'interoperabilità definiti in altri assembly. Inoltre, non disabilita il marshalling per il supporto predefinito dell'interoperabilità COM del runtime. Il supporto predefinito dell'interoperabilità COM può essere abilitato o disabilitato tramite un'opzione della funzionalità.

Funzionalità disabilitate

Quando l'oggetto DisableRuntimeMarshallingAttribute viene applicato a un assembly, gli attributi seguenti non avranno alcun effetto o genereranno un'eccezione:

  • LCIDConversionAttribute su un P/Invoke o un delegato
  • SetLastError=true su un P/Invoke
  • ThrowOnUnmappableChar=true su un P/Invoke
  • BestFitMapping=true su un P/Invoke
  • Firme del metodo con argomenti variadic .NET (varargs)
  • Parametri in, ref, out

Regole predefinite per il marshalling dei tipi comuni

Quando il marshalling è disabilitato, le regole per il marshalling predefinito cambiano in regole molto più semplici. Queste regole sono descritte di seguito. Come indicato nella documentazione sulle procedure consigliate per l'interoperabilità, i tipi copiabili da BLT sono tipi con lo stesso layout nel codice gestito e in quello nativo e come tali non richiedono alcun marshalling. Inoltre, queste regole non possono essere personalizzate con gli strumenti indicati nella documentazione sulla personalizzazione del marshalling dei parametri.

Parola chiave C# Tipo di .NET Tipo nativo
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 su P/Invoke non ha alcun effetto)
nint System.IntPtr intptr_t
nuint System.UIntPtr uintptr_t
System.Boolean bool
Tipo C# unmanaged definito dall'utente senza campi con LayoutKind.Auto Considerato come un tipo copiabile da BLT. Tutto il marshalling personalizzato degli struct viene ignorato.
Tutti gli altri tipi Non supportato

Esempi

L'esempio seguente mostra alcune funzionalità abilitate o disabilitate quando il marshalling di runtime è disabilitato. Per illustrare l'applicazione manuale di queste linee guida, questi esempi usano [DllImport] anziché l'attributo [LibraryImport] consigliato. L'analizzatore con ID SYSLIB1054 fornisce indicazioni aggiuntive quando si usa [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