Charsets et marshaling

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.