El campo DllImportAttribute.CharSet controla la serialización de cadenas y determina cómo la invocación de plataforma busca nombres de función en un archivo DLL. En este tema se describen ambos comportamientos.
Algunas API exportan dos versiones de las funciones que toman argumentos de cadena: la versión estrecha (ANSI) y la versión ancha (Unicode). La API de Windows, por ejemplo, incluye los siguientes nombres de punto de entrada para la función MessageBox:
MessageBoxA
Proporciona el formato ANSI de caracteres de 1 byte, que se distingue por una "A" anexada al nombre del punto de entrada. Las llamadas a MessageBoxA siempre serializan las cadenas en formato ANSI.
MessageBoxW
Proporciona el formato Unicode de caracteres de 2 bytes, que se distingue por una "W" anexada al nombre del punto de entrada. Las llamadas a MessageBoxW siempre serializan las cadenas en formato Unicode.
Serialización de cadenas y coincidencia de nombres
La invocación de plataforma serializa las cadenas del formato administrado (Unicode) al formato ANSI.
Coincidencia de nombres
Cuando el campo DllImportAttribute.ExactSpelling es true, como sucede de forma predeterminada en Visual Basic, la invocación de plataforma solo busca el nombre que se especifique. Por ejemplo, si especifica MessageBox, la invocación de plataforma busca MessageBox y se produce un error si no encuentra el término exacto.
Si el campo ExactSpelling es false, como sucede de forma predeterminada en C++ y C#, la invocación de plataforma busca primero el alias no alterado (MessageBox) y, luego, el nombre alterado (MessageBoxA) en el caso de que no se encuentre el alias no alterado. Tenga en cuenta que el comportamiento de la coincidencia de nombres en formato ANSI difiere del comportamiento de la coincidencia de nombres en formato Unicode.
La invocación de plataforma copia las cadenas del formato administrado (Unicode) al formato Unicode.
Coincidencia de nombres
Cuando el campo ExactSpelling es true, como sucede de forma predeterminada en Visual Basic, la invocación de plataforma solo busca el nombre que se especifique. Por ejemplo, si especifica MessageBox, la invocación de plataforma busca MessageBox y se produce un error si no encuentra el término exacto.
Si el campo ExactSpelling es false, como sucede de forma predeterminada en C++ y C#, la invocación de plataforma busca primero el alias alterado (MessageBoxW) y, luego, el nombre no alterado (MessageBox) en el caso de que no se encuentre el alias alterado. Tenga en cuenta que el comportamiento de la coincidencia de nombres en formato Unicode difiere del comportamiento de la coincidencia de nombres en formato ANSI.
La invocación de plataforma elige entre los formatos ANSI y Unicode en tiempo de ejecución en función de la plataforma de destino.
Especificación de un juego de caracteres en Visual Basic
Puede especificar un comportamiento de juego de caracteres en Visual Basic si agrega la palabra clave Ansi, Unicode o Auto a la instrucción de declaración. Si omite la palabra clave del juego de caracteres, el campo DllImportAttribute.CharSet establece como valor predeterminado el juego de caracteres ANSI.
En el ejemplo siguiente se declara la función MessageBox tres veces, cada una de ellas con un comportamiento de juego de caracteres diferente. La primera instrucción omite la palabra clave del juego de caracteres, por lo que tiene ANSI como valor predeterminado. En la segunda y tercera instrucciones se especifica explícitamente un juego de caracteres con una palabra clave.
Especificación de un juego de caracteres en C# y C++
El campo DllImportAttribute.CharSet identifica el juego de caracteres subyacente como ANSI o Unicode. El juego de caracteres controla cómo se deben serializar los argumentos de cadena para un método. Use uno de los formatos siguientes para indicar el juego de caracteres:
En el ejemplo siguiente se muestran tres definiciones administradas de la función MessageBox con atributos para especificar un juego de caracteres. En la primera definición, debido a su omisión, el campo CharSet establece como valor predeterminado el juego de caracteres ANSI.
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);
El origen de este contenido se puede encontrar en GitHub, donde también puede crear y revisar problemas y solicitudes de incorporación de cambios. Para más información, consulte nuestra guía para colaboradores.
Comentarios de .NET
.NET es un proyecto de código abierto. Seleccione un vínculo para proporcionar comentarios:
Únase a la serie de reuniones para crear soluciones de inteligencia artificial escalables basadas en casos de uso reales con compañeros desarrolladores y expertos.