Windows Phone ve Yerel Kod

Windows Phone 8 ile birlikte gelen en önemli özelliklerden biride yerel kod ile uygulama geliştirme desteği. Bu özellik sayesinde C/C++ programlama dillerinde kod yazabilirsiniz. Böyle bir özelliğin temel amacı yoğun hesaplama işlemleri yapılabilen modüller geliştirebilmek yada mevcut kod parçalarının kullanımına destek vermektir.

Bu yazıda C++ dilinde kod yazacağımız "Windows Phone Runtime Component" projesi yaratacağız. Bu proje tipinde yer alan kod parçaları derlendiğinde DLL dosyası oluşmaktadır. Son olarak DLL dosyası içerisinde yer alan, C++ ile yazılmış fonksiyonları, oluşturacağımız ana Windows Phone 8 uygulamamızdan çağıracağız. Ana uygulamamızın arayüzünü Silverlight, arkaplan kodunu ise C# dilinde yazacağız. Cihaz yada emulatör'e yüklenecek uygulama destekleyici yan DLL'ler de proje içerisine gömülüp tek bir uygulama paketi oluşturulacaktır. 

Gereksinimler:

Kaynak kod:

 

1) Öncelikle içerisinde C++ dilinde kod yazacağımız "Windows Phone Runtime Component" projesi ve Silverlight/C# ile oluşturacağımız ana uygulama projesinin yer alacağız çözüm dosyasını oluşturalım.

Resim 1: Yeni proje dosyası oluşturmak.

 Resim 1'de belirtilen şekilde yeni bir proje dosyası oluşturma komutu veriyoruz. Açılacak pencerede (Resim 2)'de belirtilen şekilde "Other Project Types", "Visual Studio Solutions" yolu altında yer alan "Blank Solution" proje tipinde bir dosya yaratıyoruz.

 

Resim 2: Boş Çözüm Dosyası oluşturmak

Çözüm dosyasına istediğiniz bir isim verebilirsiniz. Bu örnekte "Cozum" adını kullandık. Cozum dosyası altında yerel kod ve ana projelerimiz yer alacak.

 2) Cozum dosyası altına sırası ile iki yeni proje ekleyeceğiz. Birincisi Windows Phone Runtime Componen projesi. Solution Explorer penceresinden Cozum dosyasını seçip, File menusunden yeni bir proje ekleme komutu veriyoruz.

    

 Resim 3: Cozum dosyası altına yeni proje eklemek

 3) Yeni proje olarak C++ proje şablonları altında yer alan "Windows Phone Runtime Component" projesini seçip bir isim veriyoruz (Resim 4). Bu örnekte wprc adını veriyoruz.

Resim 4: Windows Phone Runtime Component

4) Oluşan yeni proje içerisinde yer alan "WindowsPhoneRuntimeComponent" adındaki sınıfı kullanabilir, adını değiştirebilir, yeni metotlar vs. ekleyebiliriz (Resim 5).

Resim 5: Windows Phone Runtime Component projesi

 5) "WindowsPhoneRuntimeComponent" adındaki sınıfımıza "Hesapla" adında, "Intiger" tipinde parametre alan ve "double" tipinde sonuç üreten yeni bir metot ekleyelim. Ekleme işlemini manuel olarak yapabileceğimiz gibi "Class Wizard" sihirbazını kullanarak da yapabiliriz. Sihirbazı kullanabilmek için, Visual Studio'da View menüsü altındaki "Class View" komutu ile sınıf penceresini açmalı, düzenleme yapmak istediğimiz sınıfı bu pencerede seçip, sağ tıklayıp, çıkan menüden "Class Wizard"ı seçmeliyiz. Çıkan Sihirbaz ekranında metotlar bölümünden istediğimiz metodu ekleyebiliriz.

  // WPRC.H dosyası
 #pragma oncenamespace wprc{    public ref class WindowsPhoneRuntimeComponent sealed    {    public:        WindowsPhoneRuntimeComponent();    double Hesapla(int p);    };}
  // WPRC.CPP dosyası 
 #include "pch.h"#include "wprc.h"using namespace wprc;using namespace Platform;WindowsPhoneRuntimeComponent::WindowsPhoneRuntimeComponent(){}double WindowsPhoneRuntimeComponent::Hesapla(int p){}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6) İç içe döngüler içerisinde yapılan işlemler genellikle çok fazla hesaplama zamanı alır. Örnek olması için Hesapla metodu içerisinde iç içe iki döngüde parametre olarak belirttiğimiz sayının trigonometrideki tanjant değerleri toplamını hesaplayıp sonuç olarak döndürecek bir kod yazıyoruz. Amaç doğru ve mantıklı bir işlem yapan kod parçasından öte, yoğun işlem gücü gerektiren bir hesaplama yaptırmak. İlerleyen yazılarda bu konuda güncel hayat örnekleri ile hesaplamalara devam edeceğiz. Hesapla metodumuzun son hali:

 double WindowsPhoneRuntimeComponent::Hesapla(int p){  double sonuc = 0;   double pi = 3.14159265359;  for (int i = 1; i < p; i++)  {       for (int j = 1; j < p; j++)      {           double radian = ((i+j) * pi) / 180;         sonuc += tan(radian);       }       }   return sonuc;}

 

 

 

 

 

 

 

 

 

 

 

 

7) Artık hesaplama işlemini yerel kod ile yaptığımız modülümüz hazır. Çözüm dosyamıza yeni bir Windows Phone 8 projesi ekleyip, Projedek' ana sayfanın ara yüzünü Silverlight ile tasarlayıp, C# dilinde kod yazarak hesaplama modülünü çağırabilir,  kullanabiliriz. Çözüm dosyamızın üzerine sağ tıklayıp, yeni proje ekleme komutu veriyoruz (bkz. Resim 3 daha önce kullandığımız komut.). Çıkan yeni proje ekleme sihirbazında (bkz. Resim 6) C# dilinde, Windows Phone proje tipinde, temel bir "Windows Phone App" projesi oluşturmak istediğimizi belirtiyoruz (Resimde kırmızı kareler içerisinde belirtilen alanlara dikkat.) ve projeye "PhoneApp1" adını veriyoruz.

 

 Resim 6: Yeni Windows Phone projesi eklemek

 8) Yeni projenin ara yüzünde yerek kod modulumuze göndereceğimiz parametre değerini kullanıcıdan almak için bir adet TextBox bileşeni, Başla komutu verebilmek için bir adet Button bileşeni ve hesaplama sonucunu göstermek içinde bir adet TextBlock bileşeni ekliyoruz. Bu bileşenlerin ölçülerini, görsel özelliklerini, ekrandaki duruşunu vs. istediğiniz şekilde değiştirebilirsiniz. Görsel detaylara fazla takılmadan Resim 7 deki gibi bir arayüz oluşturuyorum.

 Resim 7: Windows Phone ana uygulama ekran tasarım görüntüsü.

Yine aynı pencerede Textbox ve TextBlock bileşenlerine sırasıyla tbx1 ve tbc1 isimlerini veriyorum (bkz. Resim 7.1)

 

Resim 7.1: Bileşenlere isim verme.

  9) Windows Phone ana uygulama projesinin üzerine sağ tıklayıp "Set as Startup Project" olarak ayarlıyoruz (Resim 8). Böylelikle F5 düğmesine basıp projeyi çalıştırdığımızda ana uygulamamız emulator yada cihazda çalıştırılacak.

 Resim 8: Başlangıç projesi belirleme.

 10) Başlangıç projesini belirledikten sonra Resim 7 de tasarlamış olduğumuz ana ekrandaki Buton bileşenini seçip çift tıklıyoruz. Böylelikle Visual Studio bizim için butona tıklandığında çalıştırılması gereken metodu oluşturacak.

 ...namespace PhoneApp1{    public partial class MainPage : PhoneApplicationPage    {        // Constructor        public MainPage()        {... private void Button_Click_1(object sender, RoutedEventArgs e) { }  ...

 

 

 

 

 

 

 

 

 11) Butona tıklandığında, yerel kodumuzu çalıştırabilmek için, ana uygulama projesinin referanslar bölümüne yerel kod projesini eklememiz gerekiyor. Ana uygulama projesinde "References" alt klasorunu seçip sağ tıklayıp, "Add Reference" komutu veriyoruz (bkz. Resim 9).

 

 Resim 9: Yeni referans ekleme komutu.

 12) Açılan referans yönetim penceresinde (bkz. Resim 10) "Solution" kategorisi altındaki "Projects" elemanını seçiyoruz. Ana uygulamamıza ekleyebileceğimiz tüm referanslar listelenecektir. Bu örnekte "WPRC" referansını listeden seçip ardından OK düğmesine basıyoruz.

Resim 10: Çözüm dosyası içerisinde yer alan projeyi referans olarak eklemek.

13) Artık ana uygulama ekranındaki butona tıklandığında çağırılacak olan "void Button_Click_1(object sender, RoutedEventArgs e)" metodunun içerisine aşağıdaki kodu yazabiliriz.

         private void Button_Click_1(object sender, RoutedEventArgs e)        {            int p = Convert.ToInt32(tbx1.Text);            wprc.WindowsPhoneRuntimeComponent YerelKodNesnesi = new wprc.WindowsPhoneRuntimeComponent();              double s = YerelKodNesnesi.Hesapla(p);                          tbc1.Text = Convert.ToString(s);        }

 

Bu kod parçası ile "new wprc.WindowsPhoneRuntimeComponent();" komutunu vererek daha önce C++ kullanarak yazdığımız yerel kod kütüphanesi içerisinde tanımlı sınıftan bir nesne yaratıp, istediğimiz gibi kullanabiliriz. Kullanıcının TextBox bileşeni içerisine girdiği string tipindeki nümerik değeri önce integer a çevirip ardından yarattığımız "YerelKodNesnesi" adındaki nesnenin "Hesapla" metoduna parametre olarak veriyoruz. Bu metottan dönen sonucuda yine TexBlock bileşeni içerisinde gösteriyoruz. Dikkat ediniz ki TextBox kutusuna girilen değerin geçerliliği vs. konumuz dışında olduğundan kontrol edilmiyor, kullanıcının doğru numerik değerler girdiği varsayılıyor...

 14) Uygulamayı Öykünücü-Emülatör de çalıştırıp 1000-10000 gibi yüksek rakamlar girerek süresini test edin. Aynı işlemi yerel kod yerine direkt ana uygulamanız içerisinden .NET ile yazarak çalıştırmayı deneyin.