C’ DE YAZILAN DLL’ İN C#’ TA KULLANILMASI

Ne zamandır aklımda olan bir soruydu “C veya C++’ la C#’ ı nasıl aynı program içinde kullanabilirim?”. Aslında bu soruyu sormamın temel nedeni C’ nin gücü ile C#’ ın kolaylığını tek programda birleştirme arzusuydu. Kafamda birçok teori ürettim ve en sonunda mantıklı(bana göre) bir sonuç buldum. DLL’ ler…

Evet Dll benim çözümümdü. Çünkü Dll’ ler küçük program(veya kod) parçacıklarıydı ve C/C++ ile C# dillerinin ortak özelliklerinden biriydi. Sonra aklıma peki C/C++ da yazılan Dll C# ta nasıl kullanılacak sorusu geldi. Ufak bir araştırmadan sonra onunda çözümünü buldum. Bu yazımda da o bulduğum çözümü sizinle paylaşacağım. Öncelikle bilgisayarımızda Microsoft Visual Studio bulunması lazım. Visual studio dışında Dev C++ ile denedim fakat hata ile karşılaştım eğer o hatayı çözersem Dev C++ ile nasıl yapılacağı ile ilgili bir yazı daha yazarım.

Gelelim proje oluşturmaya… İki farklı proje oluşturacağım öncelikle işin C/C++ tarafını halledip sonra C# projesiyle başarımızı taçlandıracağız.

C/C++ projesi:

  1. File->New->Project
  2. Açılan pencereden Templates->Visual C++-> Win32 project’ i seçiyoruz.(Proje adını siz belirleyin ben DllDeneme ismini koydum) ve Ok butonuna basın
  3. Next butonuna basın -> Dll yazan yeri seçin ve hemen altında empty Project kısmını seçin.
  4. Solution Explorer da bulunan source files’a gelin ve sağ tıklayıp add->New item’ tıklayın. Karşınıza gelen pencereden .cpp uzantılı yine adını sizin belirleyeceğiniz dosyayı oluşturun. Dosya açılacaktır ve o dosyaya Aşağıdaki kodları yazın.

dllDeneme.cpp dosyası
——————————————————————————————————————
#include <stdio.h>

extern "C"
{
 __declspec(dllexport) void merhabaDll()
 {

  printf ("Ilk Dll dosyamiz basarili bir şekilde çalıştı!!! \n");

 }
}

———————————————————————————————————————–
“__declspec(dllexport)” ifadesi hemen dikkatinizi çekmiştir. Bu ifade tüm dışarıdan çağırılan Dll fonksiyonlarının önünde olmak zorundadır ve bunu Microsoft belirler.

“ extern “C” ” ifadesi ile kodun C dilinin kurallarına göre kodlandığını belirtmek içindir. Ve C’ye uygun kodlar bu ifadenin süslü parantezleri arasına yazılır.

Bize yabancı gelen ifadeleri açıkladığımıza göre artık kodumuzu Build edebiliriz.  Build işleminden sonra sırada C# projesi oluşturmak kaldı.

C# projesi:

C# konsol projesi oluşturmakta bir sıkıntı yaşamayacağınızı düşündüğümden o kısmı atlıyorum ve direk .cs dosyamızın içine yazılacak kodlara geliyorum.

ConsoleApplication1.cs
————————————————————————————————————————–

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
 class Program
 {
  [DllImport("DllDeneme.dll")]
  public static extern void merhabaDll();

  static void Main(string[] args)
  {
   merhabaDll();
   Console.ReadKey(); // programın hemen kapanmasını engellemek için
  }
 }
}

—————————————————————————————————————————

“System.Runtime.InteropServices” Bu sınıf Dll işlemleri için gereklidir. Ve ekliyoruz kodumuza.

[DllImport(“DllDeneme.dll”)]” bu ifade C#’ ta dll’ i projemize dahil etmek için gereklidir.

“public static extern void merhabaDll();” burada da dll içindeki foksiyonumuzu deklare ediyoruz.

Build ettiğimiz dll dosyasını C# projesinde Bin->Debug veya Realse klasörünün içine atıyoruz.

Artık kodu çalıştırdığımızda ulaşmak istediğimiz sonuçla yani mutlu sonla karşılaşıyoruz. Programcı zekanızı da işin içine katarak bu yöntemi geliştirebilirsiniz. Mesela ben bu yöntemi oyun motoru projemde kullanacağım, sizlerde projelerinizi daha dinamik hale getirmek ve C/C++’ ın gücünden istifade etmek için kullanabilirsiniz. Bu yazınında sonuna geldik umarım faydalı olmuştur. Başka yazılarda görüşmek üzere…

Merhaba Dünya

Merhaba,

Ben Furkan Yılmaz

Blog dünyasına katılmak için ilk adımı atmış bulunmaktayım.Bundan sonra bu blog’ da, programlama hakkında paylaşımlarda bulunacağım. Genel yazılarım Unity3D üzerine olmakla beraber C/C++, C# programlama dilleri hakkında da yazılarım olacaktır. Tekrar görüşene dek hoşcakalın 🙂