Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Bidang DllImportAttribute.CharSet mengontrol marshalling string dan menentukan bagaimana pemanggilan platform menemukan nama-nama fungsi dalam DLL. Topik ini menjelaskan kedua perilaku tersebut.
Beberapa API mengekspor dua versi fungsi yang mengambil argumen string: sempit (ANSI) dan wide (Unicode). API Windows, misalnya, menyertakan nama titik masuk berikut untuk fungsi:MessageBox
MessageBoxAMenyediakan pemformatan karakter ANSI 1-byte, ditandai oleh "A" yang ditambahkan ke nama titik masuk. Panggilan ke
MessageBoxAselalu memproses string dalam format ANSI.MessageBoxWMenyediakan pemformatan Unicode karakter 2 byte, dibedakan oleh "W" yang ditambahkan ke nama titik masuk. Pemanggilan ke
MessageBoxWselalu memarselkan string dalam format Unicode.
String Marshalling dan Pencocokan Nama
Bidang CharSet menerima nilai berikut:
Ansi (nilai default)
Pengolahan string
Platform memanggil string marshal dari format terkelola mereka (Unicode) ke format ANSI.
Pencocokan nama
DllImportAttribute.ExactSpelling Ketika bidang adalah
true, seperti secara default di Visual Basic, platform memanggil pencarian hanya untuk nama yang Anda tentukan. Misalnya, jika Anda menentukan MessageBox, platform memanggil pencarianMessageBoxdan gagal ketika tidak dapat menemukan ejaan yang tepat.Ketika bidang
ExactSpellingadalahfalse, sebagaimana secara default di C++ dan C#, platform melakukan pencarian untuk alias yang belum dimodifikasi terlebih dahulu (MessageBox), kemudian nama teracak (MessageBoxA) jika alias yang belum dimodifikasi tidak ditemukan. Perhatikan bahwa perilaku pencocokan nama ANSI berbeda dari perilaku pencocokan nama Unicode.
Pengolahan string
Platform memanggil salinan string dari format terkelolanya (Unicode) ke format Unicode.
Pencocokan nama
ExactSpellingKetika bidang adalahtrue, seperti secara default di Visual Basic, platform memanggil pencarian hanya untuk nama yang Anda tentukan. Misalnya, jika Anda menentukan MessageBox, platform memanggil pencarianMessageBoxdan gagal jika tidak dapat menemukan ejaan yang tepat.Ketika
ExactSpellingbidang adalahfalse, seperti secara default di C++ dan C#, platform terlebih dahulu mencari nama yang diacak (MessageBoxW), kemudian jika nama yang diacak tidak ditemukan, pencarian beralih ke alias tidak diacak (MessageBox). Perhatikan bahwa perilaku pencocokan nama Unicode berbeda dari perilaku pencocokan nama ANSI.
- Pemanggilan platform memilih antara format ANSI dan Unicode saat runtime, berdasarkan platform target.
Tentukan set karakter di Visual Basic
Anda dapat menentukan perilaku set karakter di Visual Basic dengan menambahkan Ansikata kunci , , Unicodeatau Auto ke pernyataan deklarasi. Jika Anda menghilangkan kata kunci set karakter, DllImportAttribute.CharSet bidang akan default ke kumpulan karakter ANSI.
Contoh berikut mendeklarasikan MessageBox fungsi tiga kali, setiap kali dengan perilaku set karakter yang berbeda. Pernyataan pertama mengabaikan kata kunci karakter set, sehingga karakter set 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. Set karakter mengontrol cara argumen string harus diubah saat diteruskan ke metode. 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 dikelola dari fungsi MessageBox yang diatributkan untuk menentukan kumpulan karakter. Dalam definisi pertama, karena penghapusannya, CharSet bidang secara default mengatur 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);