Karakter kümesi belirtme
Alan, DllImportAttribute.CharSet dize hazırlamayı denetler ve platform çağrısının DLL'deki işlev adlarını nasıl bulduğunu belirler. Bu konuda her iki davranış da açıklanmaktadır.
Bazı API'ler, dize bağımsız değişkenlerini alan işlevlerin iki sürümünü dışarı aktarır: dar (ANSI) ve geniş (Unicode). Örneğin Windows API'sinde MessageBox işlevi için aşağıdaki giriş noktası adları bulunur:
MessageBoxA
Giriş noktası adının sonuna eklenen "A" ile ayırt edilen 1 baytlık ANSI biçimlendirmesi sağlar. MessageBoxA çağrıları her zaman ANSI biçiminde dizeleri sıralar.
MessageBoxW
Giriş noktası adının sonuna eklenen "W" ile ayırt edilen 2 baytlık unicode biçimlendirme sağlar. MessageBoxW'a yapılan çağrılar her zaman dizeleri Unicode biçiminde sıralar.
Dize Sıralama ve Ad Eşleştirme
alanı CharSet
aşağıdaki değerleri kabul eder:
Ansi (varsayılan değer)
Dize hazırlama
Platform çağırma, dizeleri yönetilen biçimlerinden (Unicode) ANSI biçimine sıralar.
Ad eşleştirme
DllImportAttribute.ExactSpelling Alan
true
, Visual Basic'te varsayılan olarak olduğu gibi olduğunda platform çağrısı yalnızca belirttiğiniz adı arar. Örneğin, MessageBox belirtirseniz, platform çağrısı MessageBox'ı arar ve tam yazım denetimi bulamadığında başarısız olur.ExactSpelling
Alanfalse
varsayılan olarak C++ ve C# içinde olduğu gibi olduğunda, platform çağrısı önce yönetilmeyen diğer adı (MessageBox) ve ardından yönetilmeyen diğer ad bulunamazsa mangled adını (MessageBoxA) arar. ANSI ad eşleştirme davranışının Unicode ad eşleştirme davranışından farklı olduğuna dikkat edin.
Dize hazırlama
Platform çağırma, dizeleri yönetilen biçimlerinden (Unicode) Unicode biçimine kopyalar.
Ad eşleştirme
ExactSpelling
Alantrue
, Visual Basic'te varsayılan olarak olduğu gibi olduğunda platform çağrısı yalnızca belirttiğiniz adı arar. Örneğin, MessageBox belirtirseniz, platform çağrısı MessageBox'ı arar ve tam yazım denetimi bulamazsa başarısız olur.ExactSpelling
Alanfalse
varsayılan olarak C++ ve C# dilinde olduğu gibi olduğunda, platform çağrısı önce mangled adını (MessageBoxW) ve ardından mangled name bulunamazsa yönetilmeyen diğer adı (MessageBox) arar. Unicode ad eşleştirme davranışının ANSI ad eşleştirme davranışından farklı olduğuna dikkat edin.
- Platform çağrısı, hedef platformu temel alarak çalışma zamanında ANSI ve Unicode biçimleri arasında seçim sağlar.
Visual Basic'te karakter kümesi belirtme
Visual Basic'te, bildirim deyimine , Unicode
veya Auto
anahtar sözcüğünü Ansi
ekleyerek karakter kümesi davranışını belirtebilirsiniz. Karakter kümesi anahtar sözcüğünü atlarsanız, DllImportAttribute.CharSet alan varsayılan olarak ANSI karakter kümesine ayarlanır.
Aşağıdaki örnek, MessageBox işlevini her seferinde farklı karakter kümesi davranışıyla üç kez bildirir. İlk deyim karakter kümesi anahtar sözcüğünü atlar, bu nedenle karakter kümesi varsayılan olarak ANSI olur. İkinci ve üçüncü deyimler, anahtar sözcük içeren bir karakter kümesini açıkça belirtir.
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
C# ve C++ içinde bir karakter kümesi belirtme
alanı, DllImportAttribute.CharSet temel alınan karakter kümesini ANSI veya Unicode olarak tanımlar. Karakter kümesi, bir yönteme yönelik dize bağımsız değişkenlerinin nasıl hazırlanması gerektiğini denetler. Karakter kümesini belirtmek için aşağıdaki formlardan birini kullanın:
[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)]
Aşağıdaki örnekte, bir karakter kümesi belirtmek için özniteliklendirilen MessageBox işlevinin üç yönetilen tanımı gösterilmektedir. İlk tanımda, atladığı CharSet
için alan varsayılan olarak ANSI karakter kümesine ayarlanır.
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);