Marshal
Marshal sınıfıyla yönetilen/yönetilmeyen dönüşümü öğrenirsin.
Marshal sınıfı
System.Runtime.InteropServices.Marshal sınıfı, yönetilen ve yönetilmeyen türler arasında elle dönüşüm yapar. Örneğin Marshal.StringToHGlobalAnsi(str) bir string'i yerel belleğe kopyalar; Marshal.FreeHGlobal(ptr) ile serbest bırakılır.
Bu elle marshal işlemi, DllImport'ın otomatik dönüştürmediği özel türler için kullanılır. Belleği elle yönettiğin için FreeHGlobal'i unutmadan çağırmak önemlidir; aksi halde bellek sızıntısı oluşur.
Blittable türler
Blittable türler, yönetilen ve yönetilmeyen tarafta aynı bellek düzenine sahiptir; marshal kopyalaması gerektirmez (ör. int, byte, IntPtr).
Blittable olmayanlar (string, bool, char) dönüştürme gerektirir. Bu yüzden yerel API'lerle çalışırken blittable türleri tercih etmek performans kazandırır ve dönüşüm maliyetini azaltır.
Uygulama Marshal ile string kopyala
Main'de IntPtr ptr = Marshal.StringToHGlobalAnsi("Merhaba"); ile string'i yerel belleğe kopyala. Console.WriteLine("Kopyalandı"); yaz. Son olarak Marshal.FreeHGlobal(ptr); ile serbest bırak.
Örnek çözümü göster
IntPtr ptr = Marshal.StringToHGlobalAnsi("Merhaba"); Console.WriteLine("Kopyalandı"); Marshal.FreeHGlobal(ptr);
Örnek çözüm:
using System;
using System.Runtime.InteropServices;
class Program
{
static void Main()
{
IntPtr ptr = Marshal.StringToHGlobalAnsi("Merhaba");
Console.WriteLine("Kopyalandı");
Marshal.FreeHGlobal(ptr);
}
}
Kendini test et
-
String'i yerel belleğe kopyala
IntPtr ptr = Marshal.____("merhaba");Cevabı göster
IntPtr ptr = Marshal.StringToHGlobalAnsi("merhaba"); -
Hangisi blittable tür değildir?
- int
- string
- byte
- IntPtr
Cevabı göster
string — Doğru. string blittable değildir; marshal gerekir.
-
Marshal metotlarını eşleştir
- Marshal.StringToHGlobalAnsi
- String → yerel bellek
- Marshal.FreeHGlobal
- Yerel belleği serbest bırak
- Marshal.ReadInt32
- Yerel adresten int oku
- Marshal.Copy
- Dizi kopyalama