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
- Interop çağrıları normal C# metotlarına göre daha yavaştır (marshaling maliyeti).
- Yönetilmeyen kod hataları (memory leak, pointer hatası) doğrudan uygulamayı çökertir.
- Bu nedenle sadece gerçekten gerekli olduğunda kullanılmalıdır.
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
StructLayoutile uygun şekilde eşleştirilir. - Performans maliyeti vardır, dikkatli kullanılmalıdır.
İlişkili Makaleler
C# Hata Denetimi (try, catch, finally)
C#’ta try, catch ve finally bloklarını kullanarak hataları yakalamayı ve güvenli hata yönetimi yapmayı örneklerle öğrenin.
C# Struct (Yapılar) – Class ile Farkları
C#’ta struct ve class arasındaki farkları öğrenin. Bellek modeli, kalıtım, boxing ve performans karşılaştırmalarıyla açıklanıyor.
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.