Freigeben über


Angeben eines Zeichensatzes

Das DllImportAttribute.CharSet Feld steuert Zeichenfolgen-Marshalling und bestimmt, wie der Plattformaufruf Funktionsnamen in einer DLL findet. In diesem Thema werden beide Verhaltensweisen beschrieben.

Einige APIs exportieren zwei Versionen von Funktionen, die Zeichenfolgenargumente verwenden: schmal (ANSI) und breit (Unicode). Die Windows-API enthält beispielsweise die folgenden Einstiegspunktnamen für die MessageBox-Funktion :

  • MessageBoxA

    Stellt eine 1-Byte-Zeichen-ANSI-Formatierung bereit, die durch ein "A" unterschieden wird, das an den Namen des Einstiegspunkts angefügt ist. Aufrufe von MessageBoxA geben Zeichenfolgen immer im ANSI-Format weiter.

  • MessageBoxW

    Stellt eine 2-Byte-Zeichen-Unicode-Formatierung bereit, die durch ein "W" unterschieden wird, das an den Namen des Einstiegspunkts angefügt wird. Aufrufe von MessageBoxW marshallen Zeichenfolgen immer im Unicode-Format.

Marshallen von Zeichenfolgen und Namensabgleich

Das CharSet Feld akzeptiert die folgenden Werte:

Ansi (Standardwert)

  • Marshalling von Zeichenfolgen

    Plattformaufruf marshallt Zeichenfolgen aus dem verwalteten Format (Unicode) in das ANSI-Format.

  • Namensübereinstimmung

    Wenn das DllImportAttribute.ExactSpelling Feld standardmäßig in Visual Basic lautet true, ruft die Plattform Suchvorgänge nur nach dem von Ihnen angegebenen Namen auf. Wenn Sie beispielsweise MessageBox angeben, ruft die Plattform Suchvorgänge nach MessageBox auf und schlägt fehl, wenn sie die genaue Schreibweise nicht finden kann.

    Wenn das ExactSpelling-Feld standardmäßig in C++ und C# false ist, sucht das Platform-Invoce zuerst nach dem nicht verschleierten Alias (MessageBox) und dann nach dem verschleierten Namen (MessageBoxA), falls der nicht verschleierte Alias nicht gefunden wird. Beachten Sie, dass sich das VERHALTEN des ANSI-Namensabgleichs vom Verhalten des Unicode-Namensabgleichs unterscheidet.

Unicode

  • Marshalling von Zeichenfolgen

    Platform Invoke kopiert Zeichenfolgen von ihrem verwalteten Format (Unicode) in das Unicode-Format.

  • Namensübereinstimmung

    Wenn das ExactSpelling Feld standardmäßig in Visual Basic lautet true, ruft die Plattform Suchvorgänge nur nach dem von Ihnen angegebenen Namen auf. Wenn Sie beispielsweise MessageBox angeben, ruft die Plattform Suchvorgänge nach MessageBox auf und schlägt fehl, wenn sie die genaue Schreibweise nicht finden kann.

    Wenn das ExactSpelling-Feld standardmäßig in C++ und C# auf `false` gesetzt ist, sucht der Plattformaufruf zuerst nach dem verunstalteten Namen (MessageBoxW) und dann, wenn der verunstaltete Name nicht gefunden wird, nach dem unverwüstlichen Alias (MessageBox). Beachten Sie, dass sich das Unicode-Namensvergleichsverhalten von ANSI-Namensabgleichsverhalten unterscheidet.

Auto

  • Plattformaufrufe wählen zur Laufzeit basierend auf der Zielplattform zwischen ANSI- und Unicode-Formaten aus.

Angeben eines Zeichensatzes in Visual Basic

Sie können das Zeichensatzverhalten in Visual Basic angeben, indem Sie das Ansi, Unicode oder Auto Schlüsselwort zur Deklarationsanweisung hinzufügen. Wenn Sie das Schlüsselwort "Zeichensatz" weglassen, wird das DllImportAttribute.CharSet-Feld standardmäßig auf den ANSI-Zeichensatz festgelegt.

Im folgenden Beispiel wird die MessageBox-Funktion dreimal deklariert, wobei jedes Mal ein anderes Zeichensatzverhalten auftritt. Die erste Anweisung lässt das Zeichensatzschlüsselwort aus, sodass ANSI standardmäßig als Zeichensatz verwendet wird. Die zweite und dritte Anweisung geben explizit einen Zeichensatz mit einem Schlüsselwort an.

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

Angeben eines Zeichensatzes in C# und C++

Das DllImportAttribute.CharSet Feld identifiziert den zugrunde liegenden Zeichensatz als ANSI oder Unicode. Der Zeichensatz steuert, wie die Zeichenfolgenargumente für eine Methode gemarshallt werden sollen. Verwenden Sie eines der folgenden Formulare, um den Zeichensatz anzugeben:

[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)]

Das folgende Beispiel zeigt drei verwaltete Definitionen der MessageBox-Funktion , die zum Angeben eines Zeichensatzes zugeordnet ist. In der ersten Definition wird das CharSet-Feld durch die Auslassung standardmäßig auf den ANSI-Zeichensatz gesetzt.

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);

Siehe auch