CodeBlanks Logo Icon CodeBlanks

String marshalling

C# kursu · Uzman · Ders 16/47

Yönetilen string'i yerel API'ye geçirmeyi öğrenirsin.

String marshalling

Yerel API'ye string geçirmek için marshal türü belirtilir: [DllImport("x.dll", CharSet = CharSet.Ansi)] ANSI, CharSet.Unicode UTF-16, CharSet.Auto platforma göre seçer.

Ayrıca [MarshalAs(UnmanagedType.LPStr)] ile tek parametreyi dönüştürmek de mümkündür. Doğru tür, çağrılan fonksiyonun beklediği karakter kodlamasıyla eşleşmelidir; aksi halde veri bozulur ve sonuç okunamaz hale gelir.

StringBuilder ile out parametre

Yerel fonksiyon bir string'i geri yazacaksa (ör. GetWindowText), StringBuilder kullanılır. [DllImport("user32.dll")] static extern int GetWindowText(IntPtr h, StringBuilder s, int max); çağrısında StringBuilder önceden ayrılır ve geri dönüşte marshal edilir.

StringBuilder'a kapasite vermek zorunludur; yoksa sonuç eksik kalır. Bu, sabit uzunluklu C arabellekleriyle konuşmanın standart yoludur.

Uygulama CharSet ile puts çağır

[DllImport("libc.so.6", CharSet = CharSet.Ansi)] static extern int puts(string s); bildir. Main'de puts("Merhaba"); çağır, sonra Console.WriteLine("Tamam"); yaz.

Örnek çözümü göster
[DllImport("libc.so.6", CharSet = CharSet.Ansi)] static extern int puts(string s); bildir. Main'de puts("Merhaba"); Console.WriteLine("Tamam");
Örnek çözüm:
using System;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("libc.so.6", CharSet = CharSet.Ansi)]
    static extern int puts(string s);

    static void Main()
    {
        puts("Merhaba");
        Console.WriteLine("Tamam");
    }
}

Kendini test et

  1. CharSet türlerini eşleştir

    CharSet.Ansi
    ANSI (1 bayt)
    CharSet.Unicode
    UTF-16
    CharSet.Auto
    Platforma göre
    UnmanagedType.LPStr
    ANSI string işaretçi
  2. Hangi CharSet UTF-16 string kullanır?

    • CharSet.Unicode
    • CharSet.None
    • CharSet.Auto
    • CharSet.Ansi
    Cevabı göster

    CharSet.Unicode — Doğru. CharSet.Unicode UTF-16 kullanır.

  3. CharSet belirt

    [DllImport("x.dll", ____ = CharSet.Unicode)] static extern void Greet(string s);
    Cevabı göster
    [DllImport("x.dll", CharSet = CharSet.Unicode)] static extern void Greet(string s);

Uzman bölümündeki tüm dersler