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
ärfalse
, 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.
Strängr marshalling
Platform anropar kopior av strängar från deras hanterade format (Unicode) till Unicode-format.
Namnmatchning
När fältet
ExactSpelling
ärtrue
, 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
ärfalse
, 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.
- 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
, Unicode
eller 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);