CodeBlanks Logo Icon CodeBlanks

Marshal

C# kursu · Uzman · Ders 14/47

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

  1. String'i yerel belleğe kopyala

    IntPtr ptr = Marshal.____("merhaba");
    Cevabı göster
    IntPtr ptr = Marshal.StringToHGlobalAnsi("merhaba");
  2. Hangisi blittable tür değildir?

    • int
    • string
    • byte
    • IntPtr
    Cevabı göster

    string — Doğru. string blittable değildir; marshal gerekir.

  3. 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

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