Delen via


Runtime-marshalling uitgeschakeld

Wanneer het System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute kenmerk wordt toegepast op een assembly, schakelt de runtime de meeste ingebouwde ondersteuning voor gegevens marshalling tussen beheerde en systeemeigen representaties uit. In dit artikel worden de functies beschreven die zijn uitgeschakeld en hoe .NET-typen worden toegewezen aan systeemeigen typen wanneer marshalling is uitgeschakeld.

Scenario's waarbij marshalling is uitgeschakeld

Wanneer de DisableRuntimeMarshallingAttribute assembly wordt toegepast op een assembly, is dit van invloed op de typen P/Invokes en Delegate in de assembly, evenals aanroepen naar onbeheerde functieaanwijzers in de assembly. Dit heeft geen invloed op P/Invoke- of interop-gemachtigdentypen die zijn gedefinieerd in andere assembly's. Het schakelt ook marshalling niet uit voor de ingebouwde COM-interoperabiliteitsondersteuning van de runtime. De ingebouwde COM-interoperabiliteitsondersteuning kan worden ingeschakeld of uitgeschakeld via een functieswitch.

Uitgeschakelde functies

Wanneer de DisableRuntimeMarshallingAttribute toepassing op een assembly wordt toegepast, hebben de volgende kenmerken geen effect of genereert u een uitzondering:

  • LCIDConversionAttribute op een P/Invoke of een gemachtigde
  • SetLastError=true op een P/Invoke
  • ThrowOnUnmappableChar=true op een P/Invoke
  • BestFitMapping=true op een P/Invoke
  • .NET variadic argument method signatures (varargs)
  • in, , refout parameters

Standaardregels voor het marshallen van algemene typen

Wanneer marshalling is uitgeschakeld, worden de regels voor standaard marshalling gewijzigd in veel eenvoudigere regels. Deze regels worden hieronder beschreven. Zoals vermeld in de documentatie over aanbevolen procedures voor interop, zijn blittable-typen typen met dezelfde indeling in beheerde en systeemeigen code en hiervoor is geen marshalling vereist. Bovendien kunnen deze regels niet worden aangepast met de hulpprogramma's die worden vermeld in de documentatie over het aanpassen van parameters marshalling.

C#-trefwoord .NET-type Systeemeigen type
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 op de P/Invoke heeft geen effect)
nint System.IntPtr intptr_t
nuint System.UIntPtr uintptr_t
System.Boolean bool
Door de gebruiker gedefinieerd C# unmanaged -type zonder velden met LayoutKind.Auto Behandeld als een belicht type. Alle aangepaste struct marshalling wordt genegeerd.
Alle andere typen Unsupported

Voorbeelden

In het volgende voorbeeld ziet u enkele functies die zijn ingeschakeld of uitgeschakeld wanneer runtime-marshalling is uitgeschakeld. Om de handmatige toepassing van deze richtlijnen te demonstreren, worden deze voorbeelden gebruikt [DllImport] in plaats van het aanbevolen [LibraryImport] kenmerk. De analyse met id-SYSLIB1054 biedt aanvullende richtlijnen wanneer u gebruikt[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