Inaktiverad runtime-marshalling
System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute
När attributet tillämpas på en sammansättning inaktiverar körningen det mest inbyggda stödet för data marshalling mellan hanterade och inbyggda representationer. Den här artikeln beskriver de funktioner som är inaktiverade och hur .NET-typer mappas till interna typer när marshalling inaktiveras.
Scenarier där marshalling är inaktiverat
DisableRuntimeMarshallingAttribute
När används för en sammansättning påverkar den P/Invokes- och Delegate-typerna i sammansättningen, samt eventuella anrop till ohanterade funktionspekare i sammansättningen. Det påverkar inte några P/Invoke- eller interop-ombudstyper som definierats i andra sammansättningar. Den inaktiverar inte heller marshalling för körningens inbyggda COM-interop-stöd. Det inbyggda COM-interop-stödet kan aktiveras eller inaktiveras via en funktionsväxel.
Inaktiverade funktioner
När tillämpas på DisableRuntimeMarshallingAttribute
en sammansättning har följande attribut ingen effekt eller utlöser ett undantag:
- LCIDConversionAttribute på en P/Invoke eller ett ombud
SetLastError=true
på en P/InvokeThrowOnUnmappableChar=true
på en P/InvokeBestFitMapping=true
på en P/Invoke- .NET-variadic argumentmetodsignaturer (varargs)
in
,ref
,out
parametrar
Standardregler för sortering av vanliga typer
När marshalling inaktiveras ändras reglerna för standard marshalling till mycket enklare regler. Dessa regler beskrivs nedan. Som nämnts i dokumentationen om bästa praxis för interop är blittable-typer typer med samma layout i hanterad och intern kod och kräver därför ingen marshalling. Dessutom kan dessa regler inte anpassas med de verktyg som nämns i dokumentationen om anpassning av parameterr marshalling.
C#-nyckelord | .NET-typ | Ursprunglig 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 på P/Invoke har ingen effekt) |
nint |
System.IntPtr |
intptr_t |
nuint |
System.UIntPtr |
uintptr_t |
System.Boolean |
bool |
|
Användardefinierad C# unmanaged -typ utan fält med LayoutKind.Auto |
Behandlas som en blittable-typ. All anpassad struct marshalling ignoreras. | |
Alla andra typer | Unsupported |
Exempel
I följande exempel visas några funktioner som är aktiverade eller inaktiverade när runtime-marshalling inaktiveras. För att demonstrera den manuella tillämpningen av den här vägledningen använder [DllImport]
de här exemplen i stället för det rekommenderade [LibraryImport]
attributet. Analysatorn med ID SYSLIB1054 ger ytterligare vägledning när du använder [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