Condividi tramite


Specificare un set di caratteri

Il campo controlla il DllImportAttribute.CharSet marshalling delle stringhe e determina il modo in cui platform invoke trova i nomi di funzione in una DLL. In questo argomento vengono descritti entrambi i comportamenti.

Alcune API esportano due versioni di funzioni che accettano argomenti stringa: narrow (ANSI) e wide (Unicode). L'API Windows, ad esempio, include i nomi dei punti di ingresso seguenti per la MessageBox funzione:

  • MessageBoxA

    Fornisce la formattazione ANSI a 1 byte, distinta da una "A" aggiunta al nome del punto di ingresso. Le chiamate a MessageBoxA eseguono sempre il marshalling delle stringhe in formato ANSI.

  • MessageBoxW

    Fornisce la formattazione Unicode a 2 byte, distinta da una "W" aggiunta al nome del punto di ingresso. Le chiamate a MessageBoxW eseguono sempre il marshalling delle stringhe in formato Unicode.

Marshalling di stringhe e corrispondenza dei nomi

Il CharSet campo accetta i valori seguenti:

Ansi (valore predefinito)

  • Conversione di stringhe

    Platform invoke interpreta le stringhe dal formato gestito (Unicode) al formato ANSI.

  • Corrispondenza dei nomi

    Quando il DllImportAttribute.ExactSpelling campo è true, così come per impostazione predefinita in Visual Basic, platform invoke cerca solo il nome specificato. Ad esempio, se si specifica MessageBox, "platform invoke" cerca MessageBox e fallisce quando non trova l'ortografia esatta.

    Quando il ExactSpelling campo è false, come per impostazione predefinita in C++ e C#, platform invoke cerca prima l'alias non modificato (MessageBox), quindi il nome modificato (MessageBoxA) se l'alias non modificato non viene trovato. Si noti che il comportamento di corrispondenza dei nomi ANSI differisce dal comportamento di corrispondenza dei nomi Unicode.

Unicode

  • Conversione di stringhe

    Platform invoke copia le stringhe dal formato gestito (Unicode) al formato Unicode.

  • Corrispondenza dei nomi

    Quando il ExactSpelling campo è true, così come per impostazione predefinita in Visual Basic, platform invoke cerca solo il nome specificato. Ad esempio, se si specifica MessageBox, platform invoke cerca MessageBox e non riesce se non riesce a individuare l'ortografia esatta.

    Quando il ExactSpelling campo è false, così come per impostazione predefinita in C++ e C#, la piattaforma invoke cerca il nome mangled per primo (MessageBoxW), quindi l'alias non mangled (MessageBox) se il nome mangled non viene trovato. Si noti che il comportamento di corrispondenza dei nomi Unicode differisce dal comportamento di corrispondenza dei nomi ANSI.

Auto

  • Platform invoke sceglie tra formati ANSI e Unicode in fase di esecuzione, in base alla piattaforma di destinazione.

Specificare un set di caratteri in Visual Basic

È possibile specificare il comportamento del set di caratteri in Visual Basic aggiungendo la Ansiparola chiave , Unicodeo Auto all'istruzione di dichiarazione. Se si omette la parola chiave "set di caratteri", il campo DllImportAttribute.CharSet viene impostato per impostazione predefinita sul set di caratteri ANSI.

Nell'esempio seguente viene dichiarata la MessageBox funzione tre volte, ogni volta con un comportamento diverso del set di caratteri. La prima istruzione omette la parola chiave character-set, quindi il set di caratteri viene impostato per impostazione predefinita su ANSI. Le seconde e le terze istruzioni specificano in modo esplicito un set di caratteri con una parola chiave.

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

Specificare un set di caratteri in C# e C++

Il DllImportAttribute.CharSet campo identifica il set di caratteri sottostante come ANSI o Unicode. L'insieme di caratteri controlla il modo in cui gli argomenti stringa di un metodo devono essere marshallati. Utilizzare una delle forme seguenti per indicare il set di caratteri:

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

Nell'esempio seguente vengono illustrate tre definizioni gestite della MessageBox funzione con attributi per specificare un set di caratteri. Nella prima definizione, in caso di omissione, il campo CharSet viene impostato per impostazione predefinita al set di caratteri 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);

Vedere anche