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/InvokeThrowOnUnmappableChar=true
su un P/InvokeBestFitMapping=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