Letiltott futtatókörnyezeti rendezés
Amikor az System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute
attribútumot egy szerelvényre alkalmazza, a futtatókörnyezet letiltja a felügyelt és natív reprezentációk közötti adatrendezés beépített támogatását. Ez a cikk ismerteti a letiltott funkciókat, és azt, hogy a .NET-típusok hogyan képeznek natív típusokat a rendezés letiltásakor.
Forgatókönyvek, ahol a rendezés le van tiltva
Amikor a rendszer egy DisableRuntimeMarshallingAttribute
szerelvényre alkalmazza a szerelvényt, az hatással van a szerelvény P/Invokes és Delegált típusára, valamint a nem felügyelt függvénymutatók hívására a szerelvényben. Ez nem érinti a más szerelvényekben definiált P/Invoke vagy interop delegálttípusokat. Emellett nem tiltja le a futtatókörnyezet beépített COM-interop-támogatásának beállítását. A beépített COM interop-támogatás funkciókapcsolóval engedélyezhető vagy letiltható.
Letiltott funkciók
Ha a rendszer egy DisableRuntimeMarshallingAttribute
szerelvényre alkalmazza a szerelvényt, a következő attribútumok nem lesznek hatással, vagy kivételt okoznak:
- LCIDConversionAttribute P/Invoke vagy meghatalmazott esetén
SetLastError=true
P/Invoke rendszerenThrowOnUnmappableChar=true
P/Invoke rendszerenBestFitMapping=true
P/Invoke rendszeren- .NET variadikus argumentummetódus-aláírások (varargs)
in
,ref
paraméterekout
A gyakori típusok rendezési szabályai
Ha a rendezés le van tiltva, az alapértelmezett rendezési szabályok sokkal egyszerűbb szabályokra változnak. Ezeket a szabályokat az alábbiakban ismertetjük. Ahogy az ajánlott eljárások közötti dokumentációban is említettük, a titkos típusok olyan típusok, amelyek elrendezése megegyezik a felügyelt és a natív kódban, és mint ilyen, nem igényelnek rendezést. Ezen kívül ezek a szabályok nem szabhatók testre a paraméter-rendezés testreszabásáról szóló dokumentációban említett eszközökkel.
C# kulcsszó | .NET-típus | Natív típus |
---|---|---|
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 a P/Invoke nincs hatással) |
nint |
System.IntPtr |
intptr_t |
nuint |
System.UIntPtr |
uintptr_t |
System.Boolean |
bool |
|
Felhasználó által definiált C# unmanaged típus mező nélkül LayoutKind.Auto |
Titkos adattípusként kezelve. A rendszer figyelmen kívül hagyja az összes testre szabott szerkezet-rendezést . | |
Minden más típus | Támogatott |
Példák
Az alábbi példa néhány olyan funkciót mutat be, amelyek engedélyezve vannak vagy le vannak tiltva, ha a futtatókörnyezet-rendezés le van tiltva:
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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: