Aracılığıyla paylaş


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 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 bulamadığında başarısız olur.

    ExactSpelling Alan falsevarsayı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.

Unicode

  • 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 Alan falsevarsayı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.

Auto

  • 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 , Unicodeveya Auto anahtar sözcüğünü Ansiekleyerek 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);

Ayrıca bkz.