Een tekenset opgeven
Het DllImportAttribute.CharSet veld bepaalt het marshallen van tekenreeksen en bepaalt hoe met platform functienamen in een DLL worden gevonden. In dit onderwerp worden beide gedragingen beschreven.
Sommige API's exporteren twee versies van functies die tekenreeksargumenten aannemen: smal (ANSI) en breed (Unicode). De Windows-API bevat bijvoorbeeld de volgende invoerpuntnamen voor de functie MessageBox :
MessageBoxA
Biedt ANSI-opmaak van 1 byteteken, die wordt onderscheiden door een 'A' die is toegevoegd aan de naam van het invoerpunt. Aanroepen naar MessageBoxA altijd marshal tekenreeksen in ANSI-indeling.
MessageBoxW
Biedt Unicode-opmaak van 2 bytes, die wordt onderscheiden door een 'W' die is toegevoegd aan de naam van het invoerpunt. Aanroepen naar MessageBoxW altijd marshal tekenreeksen in Unicode-indeling.
Tekenreeks marshalling en naamkoppeling
Het CharSet
veld accepteert de volgende waarden:
Ansi (standaardwaarde)
Tekenreeks marshalling
Platform roept marshals-tekenreeksen aan vanuit hun beheerde indeling (Unicode) naar ANSI-indeling.
Naamkoppeling
Wanneer het DllImportAttribute.ExactSpelling veld standaard
true
is ingesteld in Visual Basic, wordt alleen door het platform gezocht naar de naam die u opgeeft. Als u bijvoorbeeld MessageBox opgeeft, roept het platform zoekopdrachten voor MessageBox aan en mislukt het wanneer de exacte spelling niet kan worden gevonden.Als het
ExactSpelling
veld standaard in C++ en C# isfalse
, zoekt het platform eerst naar de onbeheerde alias (MessageBox), dan wordt de naam van de mangled (MessageBoxA) aangeroepen als de niet-beheerde alias niet wordt gevonden. U ziet dat ansi-naamkoppelingsgedrag verschilt van unicode-naamkoppelingsgedrag.
Tekenreeks marshalling
Platform roept tekenreeksen aan van hun beheerde indeling (Unicode) naar Unicode-indeling.
Naamkoppeling
Wanneer het
ExactSpelling
veld standaardtrue
is ingesteld in Visual Basic, wordt alleen door het platform gezocht naar de naam die u opgeeft. Als u bijvoorbeeld MessageBox opgeeft, roept het platform zoekopdrachten voor MessageBox aan en mislukt het als de exacte spelling niet kan worden gevonden.Wanneer het
ExactSpelling
veld isfalse
, zoals standaard in C++ en C#, zoekt het platform eerst naar de naam van de mangled (MessageBoxW), dan de onbeheerde alias (MessageBox) als de naam van de mangled niet wordt gevonden. U ziet dat het unicode-naamkoppelingsgedrag verschilt van het ansi-naamkoppelingsgedrag.
- Platformaanroepen kiezen tussen ANSI- en Unicode-indelingen tijdens runtime, op basis van het doelplatform.
Een tekenset opgeven in Visual Basic
U kunt het gedrag van tekenset opgeven in Visual Basic door het Ansi
, Unicode
of Auto
trefwoord toe te voegen aan de declaratie-instructie. Als u het trefwoord voor tekenset weglaat, wordt het DllImportAttribute.CharSet veld standaard ingesteld op de ANSI-tekenset.
In het volgende voorbeeld wordt de functie MessageBox drie keer gedeclareert, telkens met verschillende tekensetgedrag. Met de eerste instructie wordt het trefwoord voor tekenset weggelaten, dus de tekenset wordt standaard ingesteld op ANSI. De tweede en derde instructies geven expliciet een tekenset op met een trefwoord.
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
Een tekenset opgeven in C# en C++
Het DllImportAttribute.CharSet veld identificeert de onderliggende tekenset als ANSI of Unicode. De tekenset bepaalt hoe tekenreeksargumenten voor een methode moeten worden ge marshalld. Gebruik een van de volgende formulieren om de tekenset aan te geven:
[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)]
In het volgende voorbeeld ziet u drie beheerde definities van de functie MessageBox die is toegewezen om een tekenset op te geven. In de eerste definitie, door het weglaten ervan, wordt het CharSet
veld standaard ingesteld op de ANSI-tekenset.
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);