25 Ocak 2013 Cuma

C# ile masa üstü programınıza otomatik güncelleme özelliği eklemek


.net framework kullanarak (C#) yazdığım masa üstü yazılımlardan birine otomatik güncelleme özelliği eklemek istiyordum. Bu sebeple yaptığım çalışma gayet verimli oldu. Bende bu çalışmanın aşamalarını paylaşarak masa üstü program geliştiricilerin işine yarayacağını düşündüm. Bu bir ders veya konu anlatımı değil, sadece izlemeniz gereken yolu tarif edeceğim o kadar. Hazırsanız başlayalım ;

Problemimiz masa üstü programımızın kendi kendini update edebilme özelliği. Bunun birden fazla yolu olsa bile ben kendime göre en kolay olduğunu düşündüğüm versiyonu sizinle paylaşacağım.

Diagram şu şekilde olacak ;

1. Program çalıştırıldığında kendi sürümünü internet üzerinde bir sunucuda bulunan son sürüm ile karşılaştıracak.
2. Eğer yeni sürüm var ise yeni sürük kurulum programını download edecek.
3. Download tamamlanmış ise yeni sürümü yükleme yazılımını çalıştırarak kendisini update edecek.

Standart bir winform uygulaması oluşturarak işe başladığınızı farzediyorum. İlk yapmamız gereken şey programımızın kendi sürümünü bilmesini sağlamak. Bunun için ben "program.cs" içerisine aşağıdaki kodu ekledim.


buradaki "public static string versioncode" değişkeni ile programın versiyonunu tutuyorum. Daha sonra ana formun on load olayına update kontrolünü yapacak bir bölüm ekledim. Ayrıca hemen altında bulunan "updateme" prosedürü ile update işlemini yapacak olan formu çağırdığımı fark edeceksiniz. Burada thread kullanmaktaki amaç asıl formu kapatırken programın kapanmasını engellemek.


Uygulama ana formu yüklediğinde "checkupdate" fonksiyonunu çağırıyor. Basitçe fonksiyonun yaptığı şey web sunucumda bulunan bir php dosyasına kendi sürüm numarasını "v" değişkeni ile yollamak. Php dosyası eğer sürüm aynı ise "OK" eğer programın sürümü eski ise "UPDATE" değerini döndürüyor. CheckUpdate fonksiyonunun kodları şu şekilde;


Şimdi siz "Asıl iş PHP dosyasında. Tüm işi o yapıyor!" şeklinde düşüneceksiniz ama öyle değil. Php dosyası çok çok basit bir şekilde yayında olan versiyon ile programın yolladığı versiyonu kontrol ediyor o kadar. Aşağıda php dosyasının kodunu veriyorum. (Dilerseniz aynı şeyi .asp, .aspx, .asmx, .txt gibi dosyalar ile de yapabilirsiniz. kontrol işlemini masa üstü yazılımınıza yaptırabilirsiniz. Ben bu yolu seçtim)


Gördüğünüz gibi gayet basit bir kontrol. Buradan sonra program thread açarak güncelleme formunu yüklüyor ki asıl güncelleme işini yapan bu program. Güncelleme formunda basitce yerleştirilmiş iki label ve bir progressbar var. Bu sayede kullanıcıya güncelleme işlemi ile ilgili bilgi verebiliyor, işlemin ilerlemesini gösterebiliyoruz. Ayrıca ben sırf geyik olsun diye iki adet timer ekleyerek güncelleme işlemini toplamda 10 saniye kadar da yavaşlattım.

Formun tasarımı şu şekilde :


Güncelleme prosedürü ise şu şekilde :


Hızlıca özet geçmek gerekir ise ;

destPath değişkeni indirilecek olan dosyanın yolunu tutuyor. 1.timer ticklediğinde (aktif olup çalıştıktan sonra verdiğiniz süre kadar geçince timer nesnesinin tick olayı tetiklenir) ;
timer kendini kapatıyor
webclient nesnesi oluşturularak bu nesnenin downloadfilecomplete ve downloadprogresschange olayları yeniden yazılıyor. böylece indirmenin ilerlemesini ve bitip bitmediğini takip edebiliriz.
webclient downloadfileasync fonksiyonu ile uzak sunucudaki setup.exe yerel adrese indiriliyor.

bu esnada progresschange olayı ile progressbar update ediliyor.
indirme işlemi bittiğinde tetiklenen downloadfilecomplete olayı ile de program indirilen setup.exe yazılımını çalıştırarak kendisini kapatıyor. Buradan sonra kullanıcı normal bir kurulum yapar gibi güncellemeyi kuruyor.

Sorularınız için yorum atabilir, dilerseniz bana www.mesutaslan.com.tr adresindeki resmi sitemden ulaşabilirsiniz.

Umarım faydası olur....



Not  : Bu arada şunu söylediğinizi hissediyorum "Lan bu örnek kodları niye kopyalanır şekilde vermedin de resim şeklinde verdin dingil !", asıl dingil sizsiniz, eğer programcı olmak istiyorsanız önce yazmaya alışmanız gerekiyor, kopyalayıp yapıştırmaya değil !










5 yorum:

  1. Merhaba yazınız dikkatimi çekti bir bilgi almak istiyorum sizden bana ulaşma şansınız var mı?
    E posta: serdarevleksiz@hotmail.com
    serdarevleksiz103@gmail.com


    bana ulaşırsanız memnun olurum.

    YanıtlaSil
  2. "Not" alanı anlatımdan daha iyi olmuş elinize sağlık :D

    YanıtlaSil
  3. Merhabalar ClickOnce teknolojisini güzel bir alternatif fakat bişey soracağım Update işlemini nasıl yapıyorsunuz yani kurulumu. Dosyalarını indirdikten sonra tekrar mı kuruyorsunuz büyük projelerde dosyalarda büyük olabiliyor sıkıntı olması. ClickOnce de programın tamamını değil sadece değişiklik kısmını çekiyor. Böylelikle kurulum çok hızlı oluyor. Sıfırdan kurulum gibi olursa sıkıntılı olur bence. Emeğinizi paylaştığınız için teşekkürler.

    YanıtlaSil
  4. Ek olarak:
    public updateForm()
    {
    InitializeComponent();
    timer1.Start();
    }
    yazmanız gerekecektir.

    YanıtlaSil