Dela via


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/Invoke
  • ThrowOnUnmappableChar=true på en P/Invoke
  • BestFitMapping=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