Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
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=truesur un P/Invoke -
ThrowOnUnmappableChar=truesur un P/Invoke -
BestFitMapping=truesur un P/Invoke - Signatures de méthode d'argument variadique .NET (varargs)
-
in,ref,outparamè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