String marshalling
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
-
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
-
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.
-
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);