Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
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 lautettrue
, 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.
- 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);