Compartilhar via


Especificando um conjunto de caracteres

O DllImportAttribute.CharSet campo controla a seqüência de caracteres de empacotamento e determina como invocação de plataforma localiza nomes de função em uma DLL. Este tópico descreve os dois comportamentos.

Algumas APIs exportar duas versões de funções que levam os argumentos de seqüência de caracteres: estreito (ANSI) e wide (Unicode). A API do Win32, por exemplo, inclui os seguintes nomes de ponto de entrada para o MessageBox função:

  • MessageBoxA

    Fornece 1 byte ANSI formatação de caractere, diferenciadas pela "A" anexado ao nome do ponto de entrada. Chamadas para MessageBoxA sempre empacotar seqüências de caracteres ANSI Formatar, como é comum em plataformas Windows 95 e Windows 98.

  • MessageBoxW

    Fornece a formatação de Unicode de caracteres de 2 bytes, diferenciados por um "W" anexado ao nome do ponto de entrada. Chamadas para MessageBoxW sempre empacotar seqüências de caracteres no formato Unicode, como é comum em plataformas de Windows NT, o Windows 2000 e Windows XP.

Empacotamento de seqüência de caracteres e correspondência de nome

O CharSet campo aceita os seguintes valores:

CharSet.Ansi (valor padrão)

  • String de empacotamento

    Empacota a seqüências de seu formato gerenciado (Unicode) para o formato ANSI de invocação de plataforma.

  • Correspondência de nome

    Quando o DllImportAttribute.ExactSpelling campo é true, que é o padrão em Visual Basic 2005, invocação de plataforma procura somente o nome que você especificar. Por exemplo, se você especificar MessageBox, invocação de plataforma procura MessageBox e falhar quando ele não consegue localizar a grafia exata.

    Quando o ExactSpelling campo é false, como é o padrão em C++ e C#, invocação de plataforma procura o alias unmangled primeiro (MessageBox), em seguida, o nome desconfigurado (MessageBoxA) se o alias unmangled não for encontrado. Observe que o comportamento de correspondência de nome de ANSI difere do comportamento de correspondência de nome de Unicode.

CharSet. Unicode

  • String de empacotamento

    Seqüências de cópias de seu formato gerenciado (Unicode) para o formato Unicode de invocação de plataforma.

  • Correspondência de nome

    Quando o ExactSpelling campo é true, que é o padrão em Visual Basic 2005, invocação de plataforma procura somente o nome que você especificar. Por exemplo, se você especificar MessageBox, invocação de plataforma procura MessageBox e falhar se não consegue localizar a grafia exata.

    Quando o ExactSpelling campo é false, como é o padrão em C++ e C#, invocação de plataforma procura o nome desconfigurado primeiro (MessageBoxW), em seguida, o alias unmangled (MessageBox) se o nome desconfigurado não for encontrado. Observe que o comportamento de correspondência de nome de Unicode difere do comportamento de correspondência de nome de ANSI.

CharSet.Auto

  • Invocação de plataforma escolhe entre ANSI e Unicode formatos em tempo de execução, com base na plataforma de destino.

A especificação de um conjunto de caracteres em Visual Basic

O exemplo a seguir declara o MessageBox função três vezes, cada vez com o comportamento do conjunto de caracteres diferente. Você pode especificar o comportamento do conjunto de caracteres em Visual Basic, adicionando a Ansi, Unicode, ou automático palavra-chave para a instrução de declaração.

Se você omitir a palavra-chave do conjunto de caracteres, como é feito na primeira instrução de declaração, o DllImportAttribute.CharSet padrões de campo para o conjunto de caracteres ANSI. As instruções do segunda e terceira no exemplo especificam explicitamente um conjunto de caracteres com uma palavra-chave.

Imports System.Runtime.InteropServices

Public Class Win32
   Declare Function MessageBoxA Lib "user32.dll"(ByVal hWnd As Integer, _
       ByVal txt As String, ByVal caption As String, _
       ByVal Typ As Integer) As Integer

   Declare Unicode Function MessageBoxW Lib "user32.dll" _
       (ByVal hWnd As Integer, ByVal txt As String, _
        ByVal caption As String, ByVal Typ As Integer) As Integer

   Declare Auto Function MessageBox Lib "user32.dll" _
       (ByVal hWnd As Integer, ByVal txt As String, _
        ByVal caption As String, ByVal Typ As Integer) As Integer
End Class

Especificando um conjunto de caracteres em C# e C++

O DllImportAttribute.CharSet campo identifica o subjacente conjunto de caracteres como ANSI ou Unicode. O conjunto de caracteres como argumentos de seqüência de caracteres para um método devem ser empacotados de controles. Para indicar o conjunto de caracteres, use uma das seguintes formas:

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

O exemplo a seguir mostra três definições gerenciadas da MessageBox função atribuída para especificar um conjunto de caracteres. Na primeira definição, por sua omissão, a CharSet campo padrões para o conjunto de caracteres ANSI.

[DllImport("user32.dll")]
    public static extern int MessageBoxA(int hWnd, String text, 
        String caption, uint type);
[DllImport("user32.dll", CharSet=CharSet.Unicode)]
    public static extern int MessageBoxW(int hWnd, String text, 
        String caption, uint type);
[DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern int MessageBox(int hWnd, String text, 
        String caption, uint type);
typedef void* HWND;

//Can use MessageBox or MessageBoxA.
[DllImport("user32")]
extern "C" int MessageBox(HWND hWnd,
                          String* pText,
                          String* pCaption,
                          unsigned int uType);

//Can use MessageBox or MessageBoxW.
[DllImport("user32", CharSet=CharSet::Unicode)]
extern "C" int MessageBoxW(HWND hWnd,
                          String* pText,
                          String* pCaption,
                          unsigned int uType);

//Must use MessageBox.
[DllImport("user32", CharSet=CharSet::Auto)]
extern "C" int MessageBox(HWND hWnd,
                          String* pText,
                          String* pCaption,
                          unsigned int uType);

Consulte também

Referência

DllImportAttribute

Conceitos

A criação de protótipos em código gerenciado

Exemplos de invocação de plataforma

Outros recursos

Empacotamento de dados com a plataforma chamar