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/InvokeThrowOnUnmappableChar=true
op een P/InvokeBestFitMapping=true
op een P/Invoke- .NET variadic argument method signatures (varargs)
in
, ,ref
out
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