Makale Özeti

Bu makalemde SmartClient ve bu mimari ile birlikte gelen ClickOnce teknolojisinden ayrıca VSTO ile nasıl uygulama geliştirebileceğimizden bahsedecegim. İlk bakışta bu üç konu size tamamen farklı gelebilir fakat makalenin ilerleyen satırlarında aslında bu üç konunun birbiriyle nasıl sıkı ilişki içinde olduğunu göreceksiniz.

Makale

Tüm yazılımcı arkadaşlara selamlar,

Bu makalemde SmartClient ve bu mimari ile birlikte gelen ClickOnce teknolojisinden ayrıca VSTO ile nasıl uygulama geliştirebileceğimizden bahsedecegim.
İlk bakışta bu üç konu size tamamen farklı gelebilir fakat makalenin ilerleyen satırlarında aslında bu üç konunun birbiriyle nasıl sıkı ilişki içinde olduğunu göreceksiniz.

Smart Client
Smart Client mimarisine giriş yapmadan önce Microsoft'un neden böyle bir mimari geliştirme ihtiyacı duyduğu konusuna değinelim.

Arayüz zenginliği ve uygulama dağıtım kolaylığı dengesi;
 Yazilim geliştirme internetin yaygınlaşmasıyla ve teknolojilerin gelişmesiyle yavaş yavaş web tabanlı uygulamalara doğru yöneldi.Internet tabanlı uygulamaların kolay dağıtılabilir olmasının yanısıra masaüstü uygulamalara nazaran daha az gelişmiş bir arabirime sahip olması ve masaüstü yazılımların bunun tam tersi olarak dağıtılması zor ve arabiriminin kuvvetli olması bu yönde bir açığın doğmasına neden oldu.

Masaüstü uygulamaları ve Web uygulamaları entegrasyonu;
Bundan 10 sene öncesinde piyasada bulunan paket programlar hemen hemen her gün hata veriyordu, yönetilmesi zor sistemlerdi.Son 5-6 seneye baktığımızda ise bu problemlerin çözülmesinde büyük yol katedildi.Artık sorunsuz çalışan, yönetimi kolay sistemler mevcut.Fakat bu sistemleri ele aldığımızda yazılımlar tamamiyle şirketlerin kendi iş proseslerinin hızlanmasında ve hatasız çalışmasında rol oynuyor.

Buna bir örnek vermemiz gerekirse; bir üretim prosesini ele alalım.Fabrika üretim aşamasında entegre yazılımlar hammaddenin bittiğini algılar ve fabrikanın stok modülünden gerekli hammaddenin üretim sahasına çekilmesini talep eder.Eğer stokta hammadde varsa gerekli işlemler yapılır.Bu aşamaya kadar çalışan yazılımlar tamamiyle fabrika içindedir.

Eğer stokta gerekli hammadde kalmamışsa, bu aşamada yeni nesil yazılımlar devreye girmeli ve tedarikçi firmadan gerekli siparişi vermelidir.

Microsoft aslında bu açığı kapatmak için ilk girişimlerini .NET platformunu geliştirerek atmış, web servislerini devreye sokmuştur.Bu sayede masaüstü uygulamaları ile internet arasında bir bağlantı katmanı oluşturulmuş veri akışı sağlanmıştır.

Böylece yazılımlar, şirketlerin kendi departmanları arasındaki proseslerin idaresinde rol almalarının yanısıra, iş ilişkisi içinde bulunan şirketlerin aralarındaki proseslerde de görev almaya, bu prosesleri yönetmeye başlamışlardır.

Bağlantılı ve Bağlantısız çalışabilme sıkıntısı;
Ürettiğimiz yazılımlar çoğunlukla şirket bünyesinde kullanılıyordu.Sunucularla client'lar arasında fiziksel hatlar mevcuttu.Yeni nesil yazılımlara ihtiyaç sonucunda .NET platformu geliştirildi fakat bu beraberinde yeni bir sorun getirdi.Bağlantı. Sahaya çıkan bir müsteri temsilcisi pda'sında yüklü olan yazılımları çalıştırabiliyor fakat bu sürekli bir bağlantı gerektiriyordu.

Ofis uygulamaları,makrolar - Programcı ile Kullanıcı çatışması;
Microsoft Office uygulamaları kullanım kolaylığı ve performansı ile kullanıcıların yoğun olarak kullandıkları, fakat büyük projelerde dağıtım sorunu ve makro dili yetersizliğinden dolayı programcılar tarafından tercih edilmeyen uygulamalardı.Şirketlerin yazılım geliştirme departmanları bu sorunlarla sürekli karşılaşmaktadır.
Müşteriyi kullanıcı olarak düşünürsek, kullanıcı her zaman haklıdır.Ms Office dökümanları bir şekilde uygulamaların bir parçası haline gelmelidir.



Smart Client mimarisi 

Smart Client bu sorunlara çözüm getiren, yani internet uygulamalarının dağıtım ve geniş erişim kolaylığını alan ve bunları desktop uygulamalarının yerel veri erişimi ve zengin kullanıcı arabirimi ile birleştiren, bağlantılı ve bağlantısız çalışma olanağı sağlayarak kullanıcıya daha efektif ve daha az maliyetle çalışma imkanı sunan, ve bütün bu özelliklerin mobil cihazlarda da çalışmasını öngören bu sayede kullanıcının mobilitesini sağlayan yeni bir uygulama geliştirme mimarisidir.

Aslında Smart Client bir devrim değil bir evrimdir.Kullanıcının en efektif şekilde çalışabilmesi için gerekli yazılımların geliştirilmesi için bize standartlar getirir.Eğer geliştirdiğiniz uygulama yukarıdaki problemlere çözüm getiriyorsa uygulamanız bir Smart Client uygulamasıdır.

Bu sorunlara baktığımızda çoğu .NET framework ile çözülmüştür.Geriye kalan problemlerin ise .NET VS2005 ile çözülmesi planlanmaktadır.İsterseniz VS.NET 2005 B2 ile gelen bu çözümlere bir göz atalım.

Click Once
Click Once Microsoft tarafından geliştirilen masaüstü uygulamalarını dağıtmayı, web uygulamalarını dağıtmak kadar kolaylaştıran yeni bir teknolojidir.
Dağıtma işlemi sizinde bildiğiniz üzere herhangi bir kurulum dosyasını bir ftp veya web sunucusu sayesinde yayımlayarak gerçekleştirilebilir.
Fakat Click Once teknolojisinin farkı uygulamaların sadece dağıtılmasında değil, güncellemelerin de aynı şekilde dağıtımasını sağlamasındadır.

VS2005 ile gelen bu teknolojiyi açıklamaya isterseniz bir örnek ile devam edelim.

C# ile basit bir hesaplama programı yazalım.

VS2005 ile yeni bir windows application projesi oluşturalım.



Formda kullanıcıdan 2 değer alalım ve bunları gene kullanıcının seçtiği bir işleme göre hesaplayıp sonucu verelim.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace BasitHesaplama
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
                toolStripProgressBar1.Maximum = 3;
                int Toplam = Convert.ToInt32(textBox1.Text);
                toolStripProgressBar1.Value += 1;
                Toplam += Convert.ToInt32(textBox2.Text);
                toolStripProgressBar1.Value += 1;
                textBox3.Text = Toplam.ToString();
                toolStripProgressBar1.Value += 1;
                toolStripProgressBar1.Value = 0;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
        }
    }
}

Projeyi derledikten sonra Solution Explorer çerçevesinde projemize sağ click yapalım.

VS2005 ile gelen ve click once'a ait bir 
özellik olan Publish i tıklayalım.



Publish wizard projemizi web sunucusunda hangi lokasyona dağıtmak istediğimizi
soracaktır.Dağıtım lokasyonunu seçip next butonuna basarak işleme devam edelim.

Bir sonraki aşamada Publish Wizard bizden dağıtım tipini seçmemizi isteyecektir.



- Yes, this application will be available online or offline
    Start menu'ye programın kısayolu eklenir.Ayrıca kullanıcı programı isterse Denetim Masası/Program ekle kaldır ile kaldırabilir.
- No, this application is only available online.
    Herhangi bir kısayol eklenmez.Program sadece dağıtım noktasından çalıştırılır.

Yes seçeneğini seçip Next butonuna basalım.



Son olarak Publish Wizard bizden onay ister, Finish butonuna tıklayıp dağıtımı gerçekleştiriyoruz.



Dağıtım tamamlandıktan sonra ilgili web sitesi otomatik olarak açılır.
Bu link'ten kullanıcılar kurulumlarını gerçekleştirebilirler.
İşte bu nokta kullanıcının ilk ve son defa install butonuna clicklediği noktadır. (Click Once)



Kullanıcı install butonuna tıkladıktan sonra kurulum başlar.




Evet artık kurulum tamamlanmış ve programımız çalışmıştır. Ayrıca kurulum Start Menude programlara da kendisini eklemiştir.

Aslında ClickOnce teknolojisi bu noktadan sonra önem kazanmaktadır.
Eğer biz projemizde herhangi bir değişiklik yaparsak, yeni sürüm nasıl dağıtılacak.
Hesaplama projemize bir de çıkarma özelliğini ekleyelim.



Proje kodumuzu aşağıdaki gibi güncelleyelim.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace BasitHesaplama
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
                toolStripProgressBar1.Maximum = 3;
                int Toplam = Convert.ToInt32(textBox1.Text);
                toolStripProgressBar1.Value += 1;
                Toplam += Convert.ToInt32(textBox2.Text);
                toolStripProgressBar1.Value += 1;
                textBox3.Text = Toplam.ToString();
                toolStripProgressBar1.Value += 1;
                toolStripProgressBar1.Value = 0;
            }
            else
            {
                toolStripProgressBar1.Maximum = 3;
                int Toplam = Convert.ToInt32(textBox1.Text);
                toolStripProgressBar1.Value += 1;
                Toplam -= Convert.ToInt32(textBox2.Text);
                toolStripProgressBar1.Value += 1;
                textBox3.Text = Toplam.ToString();
                toolStripProgressBar1.Value += 1;
                toolStripProgressBar1.Value = 0; 
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
        }
    }
}

Kodumuzu derledikten sonra projemiz dağıtıma hazır hale gelecektir.
Daha önce yaptığımız gibi projemizi Publish Wizard yardımıyla dağıtalım.
Peki kullanıcılar herseferinde ilgili web adresine gidip projeyi tekrar yüklemek zorundalar mı?

Click once teknolojisi sayesinde kullanıcılar Start Menu den programı çalıştırdıklarında program ilk önce ilgili web adresine gidip herhangi bir güncelleme mevcut mu diye kontrol edecektir.Eğer herhangi bir güncelleme mevcut ise otomatik olarak download edecek ve güncellemeyi gerçekleştirecektir.

Daha önce kurulumunu yapmış olduğumuz BasitHesaplama projemizi Start Menu/Programlar/BasitHesaplama menusunden çalıştıralım.



Program çalışmadan önce ilgili dağıtım lokasyonunu kontrol ederek bir güncelleme olduğunu anlamış ve güncelleme işlemi için kullanıcıdan onay istemektedir.
Kullanıcı onayından sonra gerekli güncellemeler yapılarak yeni sürüm yüklenir.


Click Once dağıtımlarını ister CD ile ister bir network paylaşımı ile isterseniz de internet üzerinden yapabilirsiniz.


VSTO (Visual Studio Tools for Office)
Bildiğiniz gibi uzun süredir VBA yardımı ile Microsoft Office uygulamalarına dinamiklik kazandırıyoruz.Excel'in veya Word'ün sunmuş olduğu makrolar ve standart fonksiyonların yetersiz kaldığı yerlerde VBA kodları kullanarak bu açıkları kapatıyorduk.Fakat dağıtım problemlerinden ve VBA dilinin gelişmemiş olmasından dolayı Ms Office uygulamalarını büyük projelere dahil edemiyorduk.Bunun yanısıra tüm kullanıcılar bilgisayarla tanıştıklarından beri kullandıkları veya bilgisayarla tanışmalarına sebep olan Office uygulamalarını kullanmak için can atıyordu.

Genellikle bu aşamada kullanıcılar ile programcılar karşı karlıya gelmekteydi.

İsterseniz biraz objektif davranıp kendimizi mesleğimizden soyutlayıp soruna kullanıcı gözünden bakalım.

Kullanıcı olarak Ms Office uygulamalarına alışmış durumdayız.Office uygulamalarının bize sunduğu rahatlık mevcut.İstenen herhangi bir yere resim,logo vs yapıştırabiliyor, kendi formüllerimizi yaratabiliyor, hatta kendi küçük programlarımızı yazıp kullanabiliyoruz.Kısacası çok ama çok rahat bir şekilde kişiselleştirebiliyor, istediğimiz zaman programcıya bağımlı olmadan değişiklikler yapabiliyor ve bunu diğer kişiler ile Outlook'un send butonu uzaklığında paylaşabiliyoruz.

Bu rahatlığı kaybetmeyi kim ister ki.

Fakat programcı gözünden baktığımızda ise bu excel uygulamalarının tek bir kanaldan dağıtımı,güncellenmesi gibi sorunlarla karşılaşıyoruz.

VSTO bize bu iki tarafı uzlaştıracak bir yapı sunmaktadır.VS.NET 2003 ile başlayan ve son halini VS.NET 2005 ile alan VSTO ile .NET dillerini kullanarak Microsoft Office uygulamaları geliştirebiliyoruz.Yani artık .NET dilinin bize sağladığı bütün olanaklardan(Web servisleri, %100 OOP yapısı vs) bir Office uygulaması geliştirirken faydalanabileceğiz.Bu siz de taktir edersiniz ki programcılar ve kullanıcılar barış yolunda atılmış önemli bir adımdır.

VSTO 2005 için önerilen kurulum;
- .NET Framework 2.0 B2
- VS.NET 2005 B2
- Visual Studio Tools for Office 2005 B2
- Microsoft Office 2003 SP1 (".NET programmability support" bileşeni seçilmeli)

Bu kurulumları gerçekleştirip VS.NET 2005 de yeni bir proje yaratmak istediğimizde artık karşımıza yeni seçenekler çıkacaktır.

Artık Visual C# projeleri arasında Office projelerini de görmekteyiz.

Yeni bir excel projesi için "Excel Workbook"'u seçebilirsiniz.
Ardından proje sihirbazı bize yeni bir dökümanla başlamak veya mevcut bir döküman üzerinden çalışmak seçeneklerini suncacktır.


Basit bir başlangıç yapmak için yeni bir döküman yaratma seçeneğini seçebilirsiniz.
Proje sihirbazı işini bitirdiğinde VS.NET geliştirme ortamı açılır ve karşımıza sanki bir Ms Excel dökümanı üzerinde çalışıyormuşuz gibi standart sheet lerimiz çıkar.

Gördüğünüz gibi VS.NET IDE sinde Excel menüleri yerleşmiştir.

Artık projemizi geliştirmeye başlayabiliriz.
MsSQL sunucusundan kur bilgilerini alarak kullanıcının anlık kur hesaplama işlemini gerçekleştirecek bir Office projesi geliştirelim.
Tablomuz şekildeki gibi olsun.

ve tablomuza bugünün bilgilerini girelim.
18/08/2005    USD    1.33
18/08/2005    EUR    1.66

Şimdi projemize geri dönelim ve sheet1 üzerine veritabanından kur bilgilerini okumamızı sağlayacak bir button yerleştirelim.
Kur bilgilerinin alınacağı iki adet hücremiz olsun ve bu hücrelerin isimleri RngUSDCurr ve RngEURCurr olsun.
En son olarak kullanıcının hesap yapacağı hücreleri oluşturalım.


Artık tek yapmamız gereken "Kur Bilgilerini Al" butonuna basıldığında Veritabanından mevcut güne ait kur bilgilerini okumak olacaktır.
Dizayn zamanında butona çift tıkladığımızda karşımıza Sheet1.cs adı altında bir C# kod sayfası çıkacaktır.Sheet1 ile ilgili bütün C# kodunu bu dosyaya yazabiliriz.
Kodumuzu buton'un click event'ine yazalım.

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using System.Data.SqlClient;

namespace ExcelWorkbook10
{
    public partial class Sheet1
    {
        private void Sheet1_Startup(object sender, System.EventArgs e)
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = new
                System.Globalization.CultureInfo(1033);
        }
        private void Sheet1_Shutdown(object sender, System.EventArgs e)
        {
        }
        #region VSTO Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.btnCurr.Click += new System.EventHandler(this.btnCurr_Click);
            this.Shutdown += new System.EventHandler(this.Sheet1_Shutdown);
            this.Startup += new System.EventHandler(this.Sheet1_Startup);
        }
        #endregion

        private void btnCurr_Click(object sender, EventArgs e)
        {
            RngEURCurr.Value2 = "";
            RngUSDCurr.Value2 = "";
            //
            SqlConnection conSQL=new SqlConnection();
            SqlCommand cmdSQL = new SqlCommand();
            cmdSQL.CommandType = CommandType.Text;
            cmdSQL.Connection = conSQL;
            cmdSQL.CommandText = "SELECT * FROM dbo.EXC_TBL WHERE (DATEDIFF(d, GETDATE(), EXC_DATE) = 0)";
            //
            try
            {
                conSQL.ConnectionString = "Server=MOBILEADMIN;Database=Test;Trusted_Connection=True";
                conSQL.Open();
            }
            catch
            {
                MessageBox.Show("DB erişiminde hata oluştu.");
                return;
            }
            //
            SqlDataReader drdSQL;
            drdSQL = cmdSQL.ExecuteReader();
            while (drdSQL.Read())
            {
                if (drdSQL.GetString(1) == "USD")
                {
                    RngUSDCurr.Value2 = drdSQL.GetSqlMoney(2).ToDecimal();
                }
                else if (drdSQL.GetString(1)== "EUR")
                {
                    RngEURCurr.Value2 = drdSQL.GetSqlMoney(2).ToDecimal();
                }
            }
            drdSQL.Close();
            conSQL.Close();
            //
            MessageBox.Show("Güncellenme tamamlandı");
        }
    }
}

Projemizi derleyelim ve çalıştıralım.
Bu işlemi yaptığımızda Ms Office Excel'in devreye girdiğini ve dökümanın açıldığını göreceksiniz.


Artık projemizi hazirladik ve kullanıcılara dağıtıma hazır duruma getirdik.Fakat ya biz sheet'de bir değişiklik olursa bunu kullanıcılara nasıl dağıtacağız?
Nasıl ki BasitHesaplama projemizde Solution Explorer'dan Publish seçeneğini tıklayarak ClickOnce teknolojisini kullandıysak aynı olanağa VSTO uygulamalarında da sahibiz.Bu sayede VSTO projelerimizde yapacağımız herhangi bir değişiklik veya yenilemede dağıtım ClickOnce teknolojisi ile otomatik olarak yapılacaktır.

Daha öncede belirttiğim gibi Ms Office dökümanları bir şekilde uygulamaların bir parçası haline gelmelidir, VSTO ve ClickOnce birleşimi bize bu altyapıyı sunmakta ve bu sayede "Office SmartClient" uygulamaları geliştirmemize olanak sağlamaktadır.

Umarım Smart Client , Click Once ve VSTO arasındaki bağı yeterince açıklayabilmişimdir.


Evet bir makalenin daha sonuna geldik.Umarım yararlı olmuştur.
Hepinize mutlu günler dilerim. 

Levent YILDIZ
Gulf Agency Company - TURKEY
IT Manager
MCP
msmoracle@hotmail.com 
levent.yildiz@gacworld.com 
http://www.gacworld.com

Kaynaklar
http://msdn.microsoft.com/
http://msdn.microsoft.com/smartclient/
http://msdn.microsoft.com/clickonce/
http://msnd.microsoft.com/vsto/