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.
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.
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
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);
Criando protótipos em código gerenciado