Especificar um conjunto de caracteres
O DllImportAttribute.CharSet campo controla a organização de cadeia de caracteres e determina como a invocação de plataforma localiza nomes de função em uma DLL. Este tópico descreve ambos os comportamentos.
Algumas APIs exportam duas versões de funções que usam argumentos de cadeia de caracteres: narrow (ANSI) e wide (Unicode). A API do Windows, por exemplo, inclui os seguintes nomes de ponto de entrada para a função MessageBox :
MessageBoxA
Fornece formatação ANSI de caractere de 1 byte, distinguida por um "A" anexado ao nome do ponto de entrada. Chamadas para MessageBoxA sempre marshal strings no formato ANSI.
MessageBoxW
Fornece formatação Unicode de caracteres de 2 bytes, distinguida por um "W" anexado ao nome do ponto de entrada. Chamadas para MessageBoxW sempre marshal strings em formato Unicode.
Marshalling de cadeias de caracteres e correspondência de nomes
O CharSet
campo aceita os seguintes valores:
Ansi (valor padrão)
Marshalling de cordas
A plataforma invoca cadeias de caracteres de marechais de seu formato gerenciado (Unicode) para o formato ANSI.
Correspondência de nomes
Quando o DllImportAttribute.ExactSpelling campo é
true
, como é por padrão no Visual Basic, a plataforma invoca pesquisas apenas para o nome que você especificar. Por exemplo, se você especificar MessageBox, a plataforma invocará pesquisas por MessageBox e falhará quando não conseguir localizar a ortografia exata.Quando o
ExactSpelling
campo éfalse
, como é por padrão em C++ e C#, a plataforma invoca a pesquisa primeiro o alias não manipulado (MessageBox) e, em seguida, o nome manipulado (MessageBoxA) se o alias não manipulado não for encontrado. Observe que o comportamento de correspondência de nome ANSI difere do comportamento de correspondência de nome Unicode.
Marshalling de cordas
A plataforma invoca cópias de cadeias de caracteres de seu formato gerenciado (Unicode) para o formato Unicode.
Correspondência de nomes
Quando o
ExactSpelling
campo étrue
, como é por padrão no Visual Basic, a plataforma invoca pesquisas apenas para o nome que você especificar. Por exemplo, se você especificar MessageBox, a plataforma invocará pesquisas por MessageBox e falhará se não conseguir localizar a ortografia exata.Quando o
ExactSpelling
campo éfalse
, como é por padrão em C++ e C#, a plataforma invoca primeiro o nome mutilado (MessageBoxW) e, em seguida, o alias não manipulado (MessageBox) se o nome distorcido não for encontrado. Observe que o comportamento de correspondência de nome Unicode difere do comportamento de correspondência de nome ANSI.
- A invocação da plataforma escolhe entre os formatos ANSI e Unicode em tempo de execução, com base na plataforma de destino.
Especificar um conjunto de caracteres no Visual Basic
Você pode especificar o comportamento do conjunto de caracteres no Visual Basic adicionando a Ansi
Unicode
, ou Auto
palavra-chave à instrução de declaração. Se você omitir a palavra-chave do conjunto de caracteres, o campo assumirá DllImportAttribute.CharSet como padrão o conjunto de caracteres ANSI.
O exemplo a seguir declara a função MessageBox três vezes, cada vez com comportamento de conjunto de caracteres diferente. A primeira instrução omite a palavra-chave do conjunto de caracteres, portanto, o padrão do conjunto de caracteres é ANSI. A segunda e terceira instruções especificam explicitamente um conjunto de caracteres com uma palavra-chave.
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
Especificar um conjunto de caracteres em C# e C++
O DllImportAttribute.CharSet campo identifica o conjunto de caracteres subjacente como ANSI ou Unicode. O conjunto de caracteres controla como os argumentos de cadeia de caracteres para um método devem ser empacotados. Use um dos seguintes formulários para indicar o conjunto de caracteres:
[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 função MessageBox atribuída para especificar um conjunto de caracteres. Na primeira definição, por sua omissão, o CharSet
campo assume como padrão o conjunto de caracteres 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);