Compartilhar via


Especificando um conjunto de caracteres

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

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

  • MessageBoxA

    Fornece formatação dos caractere de 1 byte ANSI, diferenciados por um "A" acrescentada ao nome do ponto de entrada.Chamadas para MessageBoxA sempre realizar marshaling em cadeias de caracteres no formato ANSI, sistema autônomo é comum em plataformas Windows 95 e Windows 98.

  • MessageBoxW

    Fornece Unicode formatação dos caractere de 2 byte, diferenciados por um "W" acrescentado ao nome do ponto de entrada.Chamadas para MessageBoxW sempre realizar marshaling em cadeias de caracteres no formato Unicode, sistema autônomo é comum em plataformas Windows NT, Windows 2000 e Windows XP.

Seqüência de caracteres de marshaling e correspondência de nome

The Conjunto de caracteres campo aceita os seguintes valores:

CharSet.Ansi (valor padrão)

  • String de marshaling

    Invocação de plataforma empacota seqüências de formato gerenciado (Unicode) para formato ANSI.

  • Correspondência de nome

    Quando o DllImportAttribute.ExactSpelling campo é True, sistema autônomo ele é por padrão em Visual Basic 2005, invocação de plataforma pesquisa apenas o nome especificado. Por exemplo, se você especificar MessageBox, procura invocação de plataformaMessageBox e falhar quando não consegue localizar exatamente a ortografia.

    Quando o ExactSpelling campo is False, sistema autônomo é por padrão em C++ e translation from VPE for Csharp, invocação de plataforma procura o alias unmangled primeiro (MessageBox), em seguida, o nome desconfigurado (MessageBoxA) Se não for encontrado o alias unmangled.Observe que ANSI correspondência de nome comportamento difere do comportamento de correspondência de nome Unicode.

CharSet.Unicode

  • String de marshaling

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

  • Correspondência de nome

    Quando o ExactSpelling campo is True, sistema autônomo ele é por padrão em Visual Basic 2005, invocação de plataforma pesquisa apenas o nome especificado. Por exemplo, se você especificar MessageBox, procura invocação de plataformaMessageBox e falhar se não consegue localizar exatamente a ortografia.

    Quando o ExactSpelling campo is False, sistema autônomo é por padrão em C++ e translation from VPE for Csharp, 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 comportamento de correspondência de nome Unicode é diferente do comportamento de correspondência de nome ANSI.

CharSet.Auto

  • Invocação de plataforma escolhe entre ANSI e Unicode formatos em time de execução, dependendo da plataforma de destino.

Especificando um conjunto de caractere no Visual Basic

O exemplo a seguir declara o MessageBox funcionar três vezes, a cada time com comportamento diferente do conjunto de caractere.Você pode especificar o comportamento de conjunto de caractere no Visual Basic, adicionando o ANSI, Unicode, or Automático palavra-chave para a demonstrativo de demonstrativo.

Se você omitir a palavra-chave do conjunto de caractere, sistema autônomo é concluído na primeira demonstrativo de demonstrativo, a DllImportAttribute.CharSet o padrão é o ANSI de campo conjunto de caractere. As instruções do segunda e terceira no exemplo especificam explicitamente um conjunto de caractere 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 translation from VPE for Csharp e C++

The DllImportAttribute.CharSet campo identifica base conjunto de caractere sistema autônomo ANSI ou Unicode. O conjunto de caractere controla como argumentos de seqüência de caractere para um método devem ser empacotados.Use um dos seguintes formulários para indicar o conjunto de caractere:

[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 do MessageBox função atribuída a especificar um conjunto de caractere.Na definição primeira, por sua omissão, a Conjunto de caractere campo padrão é o conjunto de caractere 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

Conceitos

Criando protótipos em código gerenciado

Exemplos de invocação de plataforma

Referência

DllImportAttribute

Outros recursos

marshaling de dados com invocação de plataforma