Dela via


Ange en teckenuppsättning

Fältet DllImportAttribute.CharSet styr strängrappning och avgör hur plattformsanrop hittar funktionsnamn i en DLL. I det här avsnittet beskrivs båda beteendena.

Vissa API:er exporterar två versioner av funktioner som använder strängargument: smal (ANSI) och bred (Unicode). Windows-API:et innehåller till exempel följande startpunktsnamn för funktionen MessageBox :

  • MessageBoxA

    Innehåller ANSI-formatering med 1 byte tecken, som särskiljs av ett "A" som läggs till i startpunktsnamnet. Anrop till MessageBoxA konverterar alltid strängar i ANSI-format.

  • MessageBoxW

    Ger unicode-formatering med 2 byte tecken, som skiljer sig från ett "W" som läggs till i startpunktsnamnet. Anrop till MessageBoxW konverterar alltid strängar i Unicode-format.

Sträng marshalling och namnmatchning

Fältet CharSet accepterar följande värden:

Ansi (standardvärde)

  • Strängr marshalling

    Plattform anropar marshals-strängar från deras hanterade format (Unicode) till ANSI-format.

  • Namnmatchning

    När fältet DllImportAttribute.ExactSpelling är true, som det är som standard i Visual Basic, anropar plattformen endast sökningar efter det namn som du anger. Om du till exempel anger MessageBox anropar plattformen sökningar efter MessageBox och misslyckas när den inte kan hitta den exakta stavningen.

    När fältet ExactSpelling är false, som det är som standard i C++ och C#, anropar plattformen sökningar efter det ohanterade aliaset först (MessageBox) och sedan det manglade namnet (MessageBoxA) om det ohanterade aliaset inte hittas. Observera att beteendet för ANSI-namnmatchning skiljer sig från Unicodes namnmatchningsbeteende.

Unicode

  • Strängr marshalling

    Platform anropar kopior av strängar från deras hanterade format (Unicode) till Unicode-format.

  • Namnmatchning

    När fältet ExactSpelling är true, som det är som standard i Visual Basic, anropar plattformen endast sökningar efter det namn som du anger. Om du till exempel anger MessageBox anropar plattformen sökningar efter MessageBox och misslyckas om den inte kan hitta den exakta stavningen.

    När fältet ExactSpelling är false, som det är som standard i C++ och C#, anropar plattformen sökningar efter det manglade namnet först (MessageBoxW) och sedan det ohanterade aliaset (MessageBox) om det manglade namnet inte hittas. Observera att Unicode-namnmatchningsbeteendet skiljer sig från beteendet för ANSI-namnmatchning.

Auto

  • Plattformsanrop väljer mellan ANSI- och Unicode-format vid körning, baserat på målplattformen.

Ange en teckenuppsättning i Visual Basic

Du kan ange beteendet för teckenuppsättningar i Visual Basic genom att lägga till nyckelordet Ansi, Unicodeeller Auto i deklarationssatsen. Om du utelämnar nyckelordet för teckenuppsättningen DllImportAttribute.CharSet är fältet standardvärdet för ANSI-teckenuppsättningen.

I följande exempel deklareras funktionen MessageBox tre gånger, varje gång med olika beteende för teckenuppsättningar. Den första instruktionen utelämnar nyckelordet för teckenuppsättningen, så teckenuppsättningen är standardinställningen ANSI. Den andra och tredje instruktionen anger uttryckligen en teckenuppsättning med ett nyckelord.

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

Ange en teckenuppsättning i C# och C++

Fältet DllImportAttribute.CharSet identifierar den underliggande teckenuppsättningen som ANSI eller Unicode. Teckenuppsättningen styr hur strängargument till en metod ska ordnas. Använd något av följande formulär för att ange teckenuppsättningen:

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

I följande exempel visas tre hanterade definitioner av funktionen MessageBox som tillskrivs för att ange en teckenuppsättning. I den första definitionen är fältet som standard ANSI-teckenuppsättningen CharSet .

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);

Se även