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 truewartość , 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 ma falsewartość , 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.

Unicode

  • Marshalling ciągów

    Platforma wywołuje ciągi z zarządzanego formatu (Unicode) do formatu Unicode.

  • Dopasowywanie nazw

    ExactSpelling Gdy pole ma truewartość , 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 ma falsewartość , 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.

Auto

  • 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 Ansisłowo kluczowe , Unicodelub 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);

Zobacz też