Yükleniyor...

C# Interop (C/C++ Kütüphaneleri ile Çalışma)

C#’ta Interop kullanarak C/C++ kütüphaneleriyle çalışmayı öğrenin. P/Invoke, unmanaged kod ve veri geçişi örneklerle açıklanıyor.

.NET uygulamalarında bazen mevcut C veya C++ kütüphanelerinden faydalanmak gerekir. Bu duruma Interop (interoperability) denir. C# dili, DllImport özniteliği ile unmanaged (yönetilmeyen) kodlara erişim sağlar. Böylece yüksek performanslı veya sistem seviyesinde fonksiyonlar doğrudan çağrılabilir.


DllImport ile Native Fonksiyon Çağırma

Windows üzerinde user32.dll veya kernel32.dll gibi sistem kütüphanelerindeki fonksiyonlar C# kodundan doğrudan çağrılabilir. Bunun için System.Runtime.InteropServices namespace’i kullanılır.


using System;
using System.Runtime.InteropServices;

class Program
{
    // Win32 API fonksiyonunu import ediyoruz
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hWnd, string text, string caption, int type);

    static void Main()
    {
        MessageBox(IntPtr.Zero, "Merhaba Interop!", "Interop Örneği", 0);
    }
}

Burada MessageBox isimli Win32 API fonksiyonu çağrılmıştır. C# tarafından derlense de, aslında native (C) kod çalıştırılmaktadır.


C Tarafında Yazılmış Fonksiyonu Çağırmak

Kendi yazdığınız bir C/C++ kütüphanesini (örneğin mylib.dll) kullanabilirsiniz. Öncelikle C tarafında bir fonksiyon tanımlanır:


// mylib.c
__declspec(dllexport) int AddNumbers(int a, int b)
{
    return a + b;
}

// C# tarafında import edilmesi
using System.Runtime.InteropServices;

class NativeMethods
{
    [DllImport("mylib.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int AddNumbers(int x, int y);
}

class Program
{
    static void Main()
    {
        int sonuc = NativeMethods.AddNumbers(5, 7);
        Console.WriteLine($"Toplam: {sonuc}");
    }
}

Bu örnekte, C dilinde yazılan AddNumbers fonksiyonu C# içerisinden çağrılmaktadır. Parametreler otomatik olarak marshaling işlemiyle uygun tipe dönüştürülür.


Struct ve Marshaling

C kütüphanelerinde sadece basit tipler değil, struct türleri de kullanılabilir. Bu durumda C# tarafında aynı yapıyı StructLayout özniteliği ile tanımlamak gerekir.


// C tarafı
typedef struct
{
    int width;
    int height;
} Size;

__declspec(dllexport) int CalcArea(Size s)
{
    return s.width * s.height;
}

// C# tarafı
[StructLayout(LayoutKind.Sequential)]
public struct Size
{
    public int width;
    public int height;
}

class NativeMethods
{
    [DllImport("mylib.dll")]
    public static extern int CalcArea(Size s);
}

class Program
{
    static void Main()
    {
        var boyut = new Size { width = 10, height = 20 };
        int alan = NativeMethods.CalcArea(boyut);
        Console.WriteLine($"Alan: {alan}");
    }
}

Performans ve Güvenlik


TL;DR

  • Interop: C/C++ kütüphanelerine C# içinden erişim sağlar.
  • DllImport özniteliği ile native fonksiyonlar çağrılır.
  • Struct’lar StructLayout ile uygun şekilde eşleştirilir.
  • Performans maliyeti vardır, dikkatli kullanılmalıdır.

İlişkili Makaleler

C# Temel Veri Tipleri

C#’ta temel veri tipleri: sayısal, metinsel, mantıksal, nesne tabanlı ve nullable tiplerin kullanımı.

C# Veri Türü Dönüşümleri

C#’ta veri türü dönüşümlerini öğrenin. Implicit ve explicit casting, Parse, TryParse ve Convert yöntemleri örneklerle açıklanıyor.