Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Het DllImportAttribute.CharSet veld bestuurt het marshallen van strings en bepaalt hoe platformaanroepen functienamen in een DLL vinden. 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.
Naamvergelijking
Wanneer het DllImportAttribute.ExactSpelling-veld in Visual Basic standaard
true
is, zoekt platformaanroep alleen 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
veldfalse
is, zoals standaard in C++ en C#, zoekt platform invoke eerst naar de ongemanglede alias (MessageBox), en dan de gemanglede naam (MessageBoxA) als de ongemanglede alias niet wordt gevonden. U ziet dat ansi-naamkoppelingsgedrag verschilt van unicode-naamkoppelingsgedrag.
Tekenreeks marshalling
Platform invoke kopieert tekenreeksen van hun beheerde indeling (Unicode) naar Unicode-indeling.
Naamvergelijking
Wanneer het
ExactSpelling
-veld in Visual Basic standaardtrue
is, zoekt platformaanroep alleen 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
veldfalse
is, zoals standaard in C++ en C#, zoekt platformaanroep eerst naar de gemanipuleerde naam (MessageBoxW), en vervolgens naar de ongemanipuleerde alias (MessageBox) indien de gemanipuleerde naam 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 tekenreeksen voor een methode moeten worden gemarshalled. 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);