Charsets et marshaling
Remarque
L’aide suivant concerne l’utilisation de [DllImport]
et doit être suivie manuellement pour obtenir des résultats corrects. Les utilisateurs NET 7+ doivent envisager d’utiliser [LibraryImport]
à la place. Un analyseur Roslyn fourni (activé par défaut) fournit l’aide requise pour l’attribut [LibraryImport]
dans votre code.
La façon dont les valeurs char
et les objets string
et System.Text.StringBuilder
sont marshalés dépend de la valeur du champ CharSet
sur P/Invoke ou la structure. Pour définir le CharSet
d’un P/Invoke, définissez le champ DllImportAttribute.CharSet lorsque vous déclarez votre P/Invoke. Pour définir le CharSet
d’un type, définissez le champ StructLayoutAttribute.CharSet sur votre déclaration de classe ou de struct. Lorsque ces champs d’attribut ne sont pas définis, c’est au compilateur du langage de déterminer quel CharSet
utiliser. C#, Visual Basic et F# utilisent l’ensemble de caractères None par défaut, qui a le même comportement que l’ensemble de caractères Ansi.
Si le module System.Runtime.InteropServices.DefaultCharSetAttribute est appliqué dans le code C# ou Visual Basic, le compilateur C# ou Visual Basic émet le code fourni CharSet
par défaut au lieu d’utiliser CharSet.None
. F# ne prend pas en charge le DefaultCharSetAttribute
et émet toujours CharSet.None
par défaut.
Le tableau suivant présente la correspondance entre chaque charset et la représentation d’un caractère ou d’une chaîne après marshaling avec ce charset :
Valeur CharSet |
Windows | .NET Core 2.2 et antérieur sur Unix | .NET Core 3.0 et ultérieur et Mono sur Unix |
---|---|---|---|
Ansi |
char (page de codes Windows (ANSI) du système par défaut) |
char (UTF-8) |
char (UTF-8) |
Unicode |
wchar_t (UTF-16) |
char16_t (UTF-16) |
char16_t (UTF-16) |
Auto |
wchar_t (UTF-16) |
char16_t (UTF-16) |
char (UTF-8) |
Lorsque vous choisissez votre charset, renseignez-vous sur la représentation native attendue.