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:
MessageBoxAStellt eine 1-Byte-Zeichen-ANSI-Formatierung bereit, die durch ein "A" unterschieden wird, das an den Namen des Einstiegspunkts angefügt ist. Aufrufe von
MessageBoxAmarshallen immer Zeichenfolgen im ANSI-Format.MessageBoxWStellt eine 2-Byte-Zeichen-Unicode-Formatierung bereit, die durch ein "W" unterschieden wird, das an den Namen des Einstiegspunkts angefügt wird. Anrufe an
MessageBoxWmarshallt 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, sucht Platform Invoke nachMessageBoxund scheitert, wenn die genaue Schreibweise nicht gefunden werden kann.Wenn das
ExactSpelling-Feld standardmäßig in C++ und C#falseist, 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
ExactSpellingFeld standardmäßig in Visual Basic lautettrue, ruft die Plattform Suchvorgänge nur nach dem von Ihnen angegebenen Namen auf. Wenn Sie beispielsweise MessageBox angeben, sucht die Plattform nachMessageBox, und es schlägt fehl, wenn sie die exakte 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 zwischen ANSI- und Unicode-Formaten, basierend auf der Zielplattform.
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 jeweils 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 Funktion, die MessageBox 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);