Określanie zestawu znaków
Pole DllImportAttribute.CharSet steruje marshalingiem ciągów i określa sposób wywoływania przez platformę nazw funkcji w bibliotece DLL. W tym temacie opisano oba zachowania.
Niektóre interfejsy API eksportują dwie wersje funkcji, które przyjmują argumenty ciągów: wąskie (ANSI) i szerokie (Unicode). Interfejs API systemu Windows, na przykład, zawiera następujące nazwy punktów wejścia dla funkcji MessageBox :
MessageBoxA
Zapewnia formatowanie ANSI o znakach 1 bajtów, wyróżniające się znakiem "A" dołączonym do nazwy punktu wejścia. Wywołania funkcji MessageBoxA zawsze marshaling ciągów w formacie ANSI.
MessageBoxW
Zapewnia formatowanie Unicode o znakach 2 bajtów, wyróżniające się znakiem "W" dołączonym do nazwy punktu wejścia. Wywołania funkcji MessageBoxW zawsze marshaling ciągów w formacie Unicode.
Marshalling ciągów i dopasowywanie nazw
Pole CharSet
akceptuje następujące wartości:
Ansi (wartość domyślna)
Marshalling ciągów
Platforma wywołuje ciągi marshals z formatu zarządzanego (Unicode) do formatu ANSI.
Dopasowywanie nazw
DllImportAttribute.ExactSpelling Gdy pole ma
true
wartość , ponieważ jest ono domyślnie w języku Visual Basic, platforma wywołuje wyszukiwanie tylko dla określonej nazwy. Jeśli na przykład określisz element MessageBox, platforma wywołuje wyszukiwanie w usłudze MessageBox i kończy się niepowodzeniem, gdy nie może zlokalizować dokładnej pisowni.ExactSpelling
Gdy pole mafalse
wartość , ponieważ jest domyślnie w języku C++ i C#, platforma wywołuje wyszukiwanie najpierw niezarządzanego aliasu (MessageBox), a następnie nazwę mangled (MessageBoxA), jeśli nie można odnaleźć niezarządzanego aliasu. Zwróć uwagę, że zachowanie dopasowywania nazw ANSI różni się od zachowania dopasowania nazw Unicode.
Marshalling ciągów
Platforma wywołuje ciągi z zarządzanego formatu (Unicode) do formatu Unicode.
Dopasowywanie nazw
ExactSpelling
Gdy pole matrue
wartość , ponieważ jest ono domyślnie w języku Visual Basic, platforma wywołuje wyszukiwanie tylko dla określonej nazwy. Jeśli na przykład określisz element MessageBox, platforma wywołuje wyszukiwanie elementu MessageBox i kończy się niepowodzeniem, jeśli nie może zlokalizować dokładnej pisowni.ExactSpelling
Gdy pole mafalse
wartość , ponieważ jest ono domyślnie w języku C++ i C#, platforma wywołuje wyszukiwanie nazwy mangled first (MessageBoxW), a następnie alias unmangled (MessageBox), jeśli nie można odnaleźć nazwy mangled. Zwróć uwagę, że zachowanie dopasowywania nazw Unicode różni się od zachowania dopasowania nazw ANSI.
- Platforma wywołuje opcje między formatami ANSI i Unicode w czasie wykonywania na podstawie platformy docelowej.
Określanie zestawu znaków w Visual Basic
Zachowanie zestawu znaków w języku Visual Basic można określić, dodając Ansi
słowo kluczowe , Unicode
lub Auto
do instrukcji deklaracji. W przypadku pominięcia słowa kluczowego DllImportAttribute.CharSet zestawu znaków pole zostanie domyślnie ustawione na zestaw znaków ANSI.
Poniższy przykład deklaruje funkcję MessageBox trzy razy, za każdym razem z innym zachowaniem zestawu znaków. Pierwsza instrukcja pomija słowo kluczowe zestawu znaków, więc znak ustawia wartość domyślną ANSI. Drugie i trzecie instrukcje jawnie określają zestaw znaków ze słowem kluczowym.
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
Określanie zestawu znaków w językach C# i C++
Pole DllImportAttribute.CharSet identyfikuje podstawowy zestaw znaków jako ANSI lub Unicode. Zestaw znaków określa sposób, w jaki argumenty ciągów do metody powinny być ustawiane marshalled. Użyj jednej z następujących formularzy, aby wskazać zestaw znaków:
[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)]
W poniższym przykładzie przedstawiono trzy zarządzane definicje funkcji MessageBox przypisane do określenia zestawu znaków. W pierwszej definicji pominięcia CharSet
pole domyślnie ustawia zestaw znaków 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);