21 Ağustos 2016 Pazar

C# İÇİNE C++ DLL EKLEME

C# için C++ dll(dynamic link library) nasıl oluşturulur size göstermeyi istiyorum.
Yanlız fonsiyon sunuyor , sınıf sunmuyor.
Aslında ben size bu nasıl çalışıyor onu göstereceğim.
C++ dll için basit bir sınıf oluşturacağım. Bir method a sahip olacak ve iki değişken geriye dönecek.
Visual Studio üzerinde New Project > C++ > Empty Project > ismine MyClassCap diyelim ve ok tıklayın. Aşağıdaki gibi…
Yukarıdaki resimdeki gibi Header File üzerine sağ klik > Add > New > Header.h tıklayın. Aşağıdaki resmi inceleyin.
Şimdi bir body eklemek istiyorum.
En üsteki resimdeki Source Files üzerine gelin sağ klik > add > new > Source.cpp yerine Body.cpp ismini değiştirin. Aşağıdaki resmi inceleyin.

Yukarıda Body.cpp nasıl oluşturduysak , aynı şekilde birde Main.cpp oluşturalım.
ilk önce Main.cpp içerisine kod yazalım.

Header.h içindeki kodu yazalım.
#pragma once kodu her zaman yazdığımız standard birşeydir.
Bir myClass adında bir sınıf oluşturalım ve constructor(yapıcı) tanımlayalım.Ayrıca söylediğim argümanları bu constructor’e geçirelim.(var_x ve var_y)
public olarak method sumX_Y() oluşturacağım.

Body.cpp içindeki kodu yazalım.

Onu test edelim. Aşağıdaki resimdeki gibi bir tane point koyalım.Yani kırmızı top ekleyelim ve daha sonra start tıklayarak derleyelim. Çıktısı 15 aşağıdaki gibi görünecek.Yani kodumuz çalışıyor.

Buraya kadar basit kod örneği oluşturduk ve çalıştırdık. Aslında ben bu sınıfı ve sumX_Y metodunu dll olarak c# içerisinde kullanmak istiyorum.
Peki onu nasıl yapacağız.Yapacağımız ilk şey özel amaçlı araç oluşturmaktır. Yeni bir proje oluşturacağız. Visual Studio üzerinde yeni bir proje açalım.C++ > Win32 projesi açalım adını CppClassDll koyalım.

Sonraki gelen ekrana next tıklayın dll seçerek Finish tıklayın.(Unutmadan gelen ekranda empty project kısmına da tik atın!!!)
Şimdi yeni bir projeye sahipsiniz. Yukarıda yaptığımız gibi Source File üzerine gelin. Sağ klik > add > new > main.cpp ekleyin.
main.cpp içerisine önceki yaptığımız projeden dosyaları include etmeye ihtiyacımız var.
Bunun için dosyaların bulunduğu dizini kopyalıyoruz.

Yukarıdaki resimdeki kopyalayıp , yeni projemizin main.cpp içerisinde #include içerisine yapıştırıyoruz.
Bu proje özel bir projedir. Her nasılsa C++ da oluşmuş fonksiyonları C# içine veriyor. extern kod sayesinde dll bağlantımızı oluşturuyoruz.
extern ile gelen kodda double kullanmalıyım.Çünkü yukarıdan alacağımız fonksiyonumuz double dönüyor. Buradaki fonksiyonun adını sumTwo(double var_x, double var_y) koyalım.
#include içerisinde dizin olarak çağırdığımız sayfalar sumTwo() fonksiyonu içinde kullanılacak.
Aşağıdaki kodda en önemli nokta extern ile başlayan koddur.
Çalışmış olduğunu görmek için compile edelim.Yani start ettik.(Başarılı bir şekilde build edilmiş olacak.)
Şimdi Konsol uygulaması C# projesi oluşturun.

using System.Runtime.InteropServices; Konsol uygulamasına ekleyeceğiz.Bu kütüphane sayesinde tüm import’lara(proje içine dosyaları alma) izin veriyor.

Yukarıdaki gibi CppClassDll yolunu kopyalayım ve Konsol projesinde public static extern double sumTwo() metodu üzerinde DllImport() parametre olarak yapıştırın.Aşağıdaki koddaki gibi.(Çift ters slash kullanmanız gerekiyor)
DllTest konsol uygulamamızdaki Program.cs kodu aşağıdadır

C++ 32 bit CPU için yazdığımızdan konsol uygulamamızda özelliklerinde 32 bit e ayarlıyalım.
Solution ‘DllTest’ üzerine sağ klik > proterties > Configuration > configuration manager> aşağıdaki gibi değiştirin.
Yukarıdaki resimdeki new diyerek X86 olarak CPU seçin.Start ettiğinizde aşağıdaki gibi bir hata verir.
Yukarıdaki hatayı önemsemeyin.Başarılı olarak build etmiş olursunuz.
Konsolun bulunduğu (benimki C:\Users\consoleAppDeneme\DllTest\DllTest\bin\Debug) dosyaya gelin ve exe’yi çalıştırın.
Kodun Çıktısı: