Partager via


Mappage de l'exécution désactivé

Lorsque l’attribut System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute est appliqué à un assembly, le runtime désactive la plupart des supports intégrés pour le marshaling des données entre les représentations gérées et natives. Cet article décrit les fonctionnalités désactivées et la façon dont les types .NET sont mappés aux types natifs lors de la désactivation du marshaling.

Scénarios où le marshaling est désactivé

Lorsque DisableRuntimeMarshallingAttribute est appliqué à un assembly, cela affecte les types P/Invokes et Delegates dans l’assembly, ainsi que les appels aux pointeurs de fonctions non gérés dans l’assembly. Cela n’affecte pas les type de délégué P/Invoke ou interop définis dans d’autres assemblys. Cela ne désactive pas non plus le marshaling pour la prise en charge intégrée de l’interopérabilité COM du runtime. La prise en charge intégrée de l’interopérabilité COM peut être activée ou désactivée via un commutateur de fonctionnalité.

Fonctionnalités désactivées

Lorsque DisableRuntimeMarshallingAttribute est appliqué à une assembly, les attributs suivants n’ont aucun effet ou peuvent lever une exception :

  • LCIDConversionAttribute sur un P/Invoke ou un delegate
  • SetLastError=true sur un P/Invoke
  • ThrowOnUnmappableChar=true sur un P/Invoke
  • BestFitMapping=true sur un P/Invoke
  • Signatures de méthode d'argument variadique .NET (varargs)
  • in, ref, out paramètres

Règles par défaut de marshaling des types courants

Lorsque le marshallage est désactivé, les règles de marshallage par défaut sont remplacées par des règles beaucoup plus simples. Ces règles sont décrites ci-dessous. Comme mentionné dans la documentation sur les meilleures pratiques d’interopérabilité, les types blittables sont des types avec la même disposition dans le code managé et natif et, par conséquent, ne nécessitent pas de marshaling. De plus, ces règles ne peuvent pas être personnalisées avec les outils mentionnés dans la documentation sur la personnalisation du marshaling des paramètres.

Mot clé C# Type .NET Type natif
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 sur le P/Invoke n’a aucun effet)
nint System.IntPtr intptr_t
nuint System.UIntPtr uintptr_t
System.Boolean bool
Type C# unmanaged défini par l’utilisateur sans champs avec LayoutKind.Auto Traité en tant que type blittable. Tout le marshaling de structure personnalisé est ignoré.
Tous les autres types non pris en charge

Exemples

L’exemple suivant montre certaines fonctionnalités activées ou désactivées lorsque le marshaling du runtime est désactivé. Pour illustrer l’application manuelle de cette aide, ces exemples utilisent [DllImport] plutôt que l’attribut recommandé [LibraryImport] . L’analyseur avec ID SYSLIB1054 fournit des conseils supplémentaires lorsque vous utilisez [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