Partager via


Spécifier un jeu de caractères

Le champ DllImportAttribute.CharSet contrôle le marshaling des chaînes et détermine de quelle façon l’appel de code non managé recherche des noms de fonction dans une DLL. Cette rubrique décrit les deux comportements.

Certaines API exportent deux versions de fonctions qui prennent des arguments de chaîne : étroite (ANSI) et large (Unicode). L’API Windows, par exemple, inclut les noms de point d’entrée suivants pour la MessageBox fonction :

  • MessageBoxA

    Fournit une mise en forme ANSI de 1 octets, distinguée par un « A » ajouté au nom du point d’entrée. Appels à MessageBoxA marshalise toujours des chaînes au format ANSI.

  • MessageBoxW

    Fournit une mise en forme Unicode de 2 octets, distinguée par un « W » ajouté au nom du point d’entrée. Appels à MessageBoxW acheminent toujours les chaînes au format Unicode.

Marshaling de chaînes et correspondance de noms

Le CharSet champ accepte les valeurs suivantes :

Ansi (valeur par défaut)

  • Marshaling de chaînes

    L’appel de code non managé marshale les chaînes de leur format managé (Unicode) au format ANSI.

  • Correspondance des noms

    Lorsque le DllImportAttribute.ExactSpelling champ est true, tel qu’il est par défaut dans Visual Basic, l’appel de plateforme recherche uniquement le nom que vous spécifiez. Par exemple, si vous spécifiez MessageBox, l’appel de plateforme recherche MessageBox et échoue lorsqu’il ne peut pas localiser l’orthographe exacte.

    Lorsque le ExactSpelling champ est false, tel qu’il est par défaut en C++ et en C#, l'appel de plateforme invoque d’abord l’alias non transformé (MessageBox), puis le nom transformé (MessageBoxA) si l’alias non transformé est introuvable. Notez que le comportement de correspondance de noms ANSI diffère du comportement de correspondance de noms Unicode.

Unicode

  • Marshaling de chaînes

    L’appel de code non managé copie les chaînes de leur format managé (Unicode) au format Unicode.

  • Correspondance des noms

    Lorsque le ExactSpelling champ est true, tel qu’il est par défaut dans Visual Basic, l’appel de plateforme recherche uniquement le nom que vous spécifiez. Par exemple, si vous spécifiez MessageBox, l’appel de plateforme recherche MessageBox et échoue s’il ne peut pas localiser l’orthographe exacte.

    Lorsque le ExactSpelling champ est false, comme c'est le cas par défaut en C++ et en C#, l'appel de fonction plateforme recherche d'abord le nom mangé (MessageBoxW), puis l'alias non mangé (MessageBox) si le nom mangé est introuvable. Notez que le comportement de correspondance de noms Unicode diffère du comportement de correspondance de noms ANSI.

Auto

  • L’appel de plateforme choisit entre les formats ANSI et Unicode au moment de l’exécution, en fonction de la plateforme cible.

Définir un jeu de caractères dans Visual Basic

Vous pouvez spécifier le comportement du jeu de caractères en Visual Basic en ajoutant les mots clés Ansi, Unicode, ou Auto à l'instruction de déclaration. Si vous omettez le mot-clé de jeu de caractères, le champ DllImportAttribute.CharSet utilise par défaut le jeu de caractères ANSI.

L’exemple suivant déclare la fonction MessageBox trois fois, chaque fois avec un comportement de jeu de caractères différent. La première instruction omet le mot clé character-set. Par conséquent, le jeu de caractères est défini par défaut sur ANSI. Les deuxième et troisième instructions spécifient explicitement un jeu de caractères avec un mot clé.

Friend Class NativeMethods
    Friend Declare Function MessageBoxA Lib "user32.dll" (
        ByVal hWnd As IntPtr,
        ByVal lpText As String,
        ByVal lpCaption As String,
        ByVal uType As UInteger) As Integer

    Friend Declare Unicode Function MessageBoxW Lib "user32.dll" (
        ByVal hWnd As IntPtr,
        ByVal lpText As String,
        ByVal lpCaption As String,
        ByVal uType As UInteger) As Integer

    Friend Declare Auto Function MessageBox Lib "user32.dll" (
        ByVal hWnd As IntPtr,
        ByVal lpText As String,
        ByVal lpCaption As String,
        ByVal uType As UInteger) As Integer
End Class

Spécifier un jeu de caractères en C# et C++

Le DllImportAttribute.CharSet champ identifie le jeu de caractères sous-jacent comme ANSI ou Unicode. Le jeu de caractères contrôle la manière dont les arguments de chaîne d’une méthode doivent être marshalés. Utilisez l’un des formulaires suivants pour indiquer le jeu de caractères :

[DllImport("DllName", CharSet = CharSet.Ansi)]
[DllImport("DllName", CharSet = CharSet.Unicode)]
[DllImport("DllName", CharSet = CharSet.Auto)]
[DllImport("DllName", CharSet = CharSet::Ansi)]
[DllImport("DllName", CharSet = CharSet::Unicode)]
[DllImport("DllName", CharSet = CharSet::Auto)]

L’exemple suivant montre trois définitions managées de la MessageBox fonction attribuée pour spécifier un jeu de caractères. Dans la première définition, par omission, le champ CharSet est réglé par défaut sur le jeu de caractères ANSI.

using System;
using System.Runtime.InteropServices;

internal static class NativeMethods
{
    [DllImport("user32.dll")]
    internal static extern int MessageBoxA(
        IntPtr hWnd, string lpText, string lpCaption, uint uType);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    internal static extern int MessageBoxW(
        IntPtr hWnd, string lpText, string lpCaption, uint uType);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    internal static extern int MessageBox(
        IntPtr hWnd, string lpText, string lpCaption, uint uType);
}
typedef void* HWND;

// Can use MessageBox or MessageBoxA.
[DllImport("user32")]
extern "C" int MessageBox(
    HWND hWnd, String* lpText, String* lpCaption, unsigned int uType);

// Can use MessageBox or MessageBoxW.
[DllImport("user32", CharSet = CharSet::Unicode)]
extern "C" int MessageBoxW(
    HWND hWnd, String* lpText, String* lpCaption, unsigned int uType);

// Must use MessageBox.
[DllImport("user32", CharSet = CharSet::Auto)]
extern "C" int MessageBox(
    HWND hWnd, String* lpText, String* lpCaption, unsigned int uType);

Voir aussi