Tentukan kumpulan karakter
Bidang DllImportAttribute.CharSet mengontrol penyusunan string dan menentukan bagaimana platform memanggil menemukan nama fungsi dalam DLL. Topik ini menjelaskan kedua perilaku tersebut.
Beberapa API mengekspor dua versi fungsi yang mengambil argumen string: sempit (ANSI) dan lebar (Unicode). API Windows, misalnya, menyertakan nama titik entri berikut untuk fungsi MessageBox:
MessageBoxA
Menyediakan pemformatan ANSI karakter 1-byte, yang dibedakan oleh "A" yang ditambahkan ke nama titik masuk. Panggilan ke MessageBoxA selalu marshal string dalam format ANSI.
MessageBoxW
Menyediakan pemformatan Unicode karakter 2-byte, yang dibedakan oleh "W" yang ditambahkan ke nama titik masuk. Panggilan ke MessageBoxW selalu marshal string dalam format Unicode.
Penyusunan string dan Pencocokan Nama
Bidang CharSet
menerima nilai berikut:
Ansi (nilai default)
Penyusunan string
Platform memanggil string marshal dari format terkelolanya (Unicode) ke format ANSI.
Pencocokan nama
Ketika bidang DllImportAttribute.ExactSpelling adalah
true
, seperti secara default di Visual Basic, platform memanggil pencarian hanya untuk nama yang Anda tentukan. Misalnya, jika Anda menentukan MessageBox, platform memanggil pencarian untuk MessageBox dan gagal ketika tidak dapat menemukan ejaan yang tepat.Ketika bidang
ExactSpelling
adalahfalse
, seperti secara default di C++ dan C#, platform memanggil pencarian untuk alias yang tidak terkelola terlebih dahulu (MessageBox), maka nama terkelola (MessageBoxA) jika alias yang tidak diubah tidak ditemukan. Perhatikan bahwa perilaku pencocokan nama ANSI berbeda dari perilaku pencocokan nama Unicode.
Penyusunan string
Platform memanggil string salinan dari format terkelolanya (Unicode) ke format Unicode.
Pencocokan nama
Ketika bidang
ExactSpelling
adalahtrue
, seperti secara default di Visual Basic, platform memanggil pencarian hanya untuk nama yang Anda tentukan. Misalnya, jika Anda menentukan MessageBox, platform memanggil pencarian untuk MessageBox dan gagal jika tidak dapat menemukan ejaan yang tepat.Ketika bidang
ExactSpelling
adalahfalse
, seperti secara default di C++ dan C#, platform memanggil pencarian untuk nama terkelola terlebih dahulu (MessageBoxW), maka alias yang tidak diubah (MessageBox) jika nama yang terputus tidak ditemukan. Perhatikan bahwa perilaku pencocokan nama Unicode berbeda dari perilaku pencocokan nama ANSI.
- Pemanggilan platform memilih antara format ANSI dan Unicode pada durasi, berdasarkan platform target.
Tentukan kumpulan karakter dalam Visual Basic
Anda dapat menentukan perilaku set karakter dalam Visual Basic dengan menambahkan kata kunci Ansi
, Unicode
, atau Auto
ke pernyataan deklarasi. Jika Anda menghilangkan kata kunci set karakter, bidang default DllImportAttribute.CharSet ke kumpulan karakter ANSI.
Contoh berikut mendeklarasikan fungsi MessageBox tiga kali, setiap kali dengan perilaku set karakter yang berbeda. Pernyataan pertama menghilangkan kata kunci set karakter, sehingga karakter diatur secara default ke ANSI. Pernyataan kedua dan ketiga secara eksplisit menentukan kumpulan karakter dengan kata kunci.
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
Tentukan set karakter di C# dan C++
Bidang DllImportAttribute.CharSet mengidentifikasi kumpulan karakter yang mendasar sebagai ANSI atau Unicode. Kumpulan karakter mengontrol bagaimana argumen string ke metode harus disusun. Gunakan salah satu formulir berikut untuk menunjukkan kumpulan karakter:
[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)]
Contoh berikut menunjukkan tiga definisi terkelola dari fungsi MessageBox yang diatributkan untuk menentukan kumpulan karakter. Dalam definisi pertama, dengan kelalaiannya, bidang default CharSet
ke set karakter 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);