Makale Özeti

ClickOnce ile uygulama dağıtımı hakkında önceki makalelerimde bilgi vermiştim. Bu makalemde ise System.Deployment.Application namespace'i ile uygulamamızda ClickOnce'ı programatik olarak kullanmaktan bahsedeceğim. System.Deployment.Application namespace'indeki en önemli class ApplicationDeployment class'ıdır. Bu class yardımıyla uygulamanın update'lerinin kontrolü, uygulamanın kurulu versiyon bilgileri, uygulama ile indirilecek olan dosyaların kontrolü gibi işlemler yapılabilir.

Makale

        Merhabalar,

        ClickOnce ile uygulama dağıtımı hakkında önceki makalelerimde bilgi vermiştim. Bu makalemde ise System.Deployment.Application namespace'i ile uygulamamızda ClickOnce'ı programatik olarak kullanmaktan bahsedeceğim. System.Deployment.Application namespace'indeki en önemli class ApplicationDeployment class'ıdır. Bu class yardımıyla uygulamanın update'lerinin kontrolü, uygulamanın kurulu versiyon bilgileri, uygulama ile indirilecek olan dosyaların kontrolü gibi işlemler yapılabilir. Aşağıda bu namespace'e ait önemli property'ler,metodlar ve görevleri listelenmiştir:

Property'ler

ActivationUri :

Uygulamanın manifest dosyasının çağrıldığı URL'i verir.

CurrentDeployment:

Uygulamanın mevcut ApplicationDeployment özelliklerinin okunabileceği  property'dir.

CurrentVersion:

Uygulamanın çalışan mevcut deployment versiyon bilgisinin alınabileceği property'dir.

DataDirectory :

ClickOnce uygulamasnın data klasörünün yolunu verir.

IsFirstRun:

Uygulamanın yüklü versiyonunun bilgisayarda ilk defa çalıştırılıp çalıştırılmadığı bilgisinin okunabileceği property'dir.

IsNetworkDeployed:

Uygulamanın bir ClickOnce uygulaması olup olmadığı bilgisinin okunabileceği propery'dir.

TimeOfLastUpdateCheck:

Uygulamanın en son ne zaman güncelleme kontrolünün yapıldığı bilgisinin okunabileceği property'dir.

UpdatedApplicationFullName

Güncelleme sonrası uygulamanın isminin okunabileceği property'dir.

UpdatedVersion:

Yüklü olan uygulama versiyon bilgisinin okunabileceği property'dir.

UpdateLocation:

Uygulamanın update edildiği lokasyon bilgisinin okunabileceği property'dir.

Metod'lar
CheckForDetailedUpdate CheckForUpdate ile aynı işlemi yapar ancak daha detaylı bilgi döndürür.

CheckForUpdate:

Yeni bir güncelleştirme olup olmadığını kontrol eder.

CheckForUpdateAsync Yeni bir güncelleştirme olup olmadığını asenkron olarak kontrol eder.
CheckForUpdateAsyncCancel Asenkron yapılan güncelleştirme kontrolünü iptal eder.
DownloadFileGroup Belirli bir gruba ait dosyaları indiren metoddur.
DownloadFileGroupAsync Belirli bir gruba ait dosyaları asenkron olarak indiren metoddur.
DownloadFileGroupAsyncCancel Belirli bir gruba ait dosyaları asenkron indirirken iptal edilmesi için kullanılan metoddur.
IsFileGroupDownloaded Belirtilen isimdeki FileGroup'un istemciye indirilip indirilmediğinin kontrol edilebileceği metoddur.

Update

Uygulamanın en son versiyonunun indirilmesi ve kurulması işlemini başlatır.

UpdateAsync Uygulamanın en son versiyonunun indirilmesi ve kurulması işlemini asenkron olarak başlatır.
UpdateAsyncCancel Asenkron olarak başlatılmış uygulamanın en son versiyonunun indirilmesi ve kurulması işlemini iptal eder.
Event'lar
CheckForUpdateCompleted CheckForUpdateAsync metodu tamamlandığında tetiklenir.
CheckForUpdateProgressChanged CheckForUpdateAsync metodunda bir güncelleme bulunduğunda tetiklenir.
DownloadFileGroupCompleted FileGroup download'ı bittiğinde tetiklenir.
DownloadFileGroupProgressChanged DownloadFileGroupAsync metodunda bir filegroup download işlemi bulunduğunda tetiklenir.

UpdateCompleted

Uygulamanın güncelleştirmesi bittiğinde kullanılabilecek event.

UpdateprogressChanged UpdateAsync metodunda bir güncelleme işlemi başladığında tetiklenir.

        Şimdi örnek bir uygulamada System.Deployment.Application namespace'i ile yapılabileceklere göz atalım. Yeni bir Windows uygulaması oluşturup, formu aşağıdaki gibi dizayn edelim:



        Görüldüğü üzere ilk buton ile uygulamamızın publish edilmiş yeni bir versiyonunun olup olmadığını kontrol edeceğiz ve yeni versiyon varsa ClickOnce ile kurulumunu yapacağız. İkinci buton ile ise uygulamamızın yüklü versiyonu, güncelleme lokasyonu gibi bilgilerini label'lara yazdıracağız. Formumuza System.Deployment.Application namespace'ini import ettikten sonra  öncelikle güncelleme olup olmadığı kontrolünün koduna bakalım:

       private void btnGuncellemeVarMi_Click(object sender, EventArgs e)
         {
            ApplicationDeployment
ad;
           
try
           
{
                ad = ApplicationDeployment.CurrentDeployment;
                if
(ad.CheckForUpdate()) //uygulamamızın güncellemesinin olup olmadığının kontrolünü yapıyoruz.
               
{
                    if
(MessageBox.Show("Uygulamanın yeni versiyonu bulunmakta. Kurmak ister misiniz?", "Güncelleme Bulundu", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        ad.Update(); //güncelleştirme indiriliyor ve kuruluyor.
                        MessageBox
.Show("Uygulama güncellemesi tamamlandı. Uygulama yeniden başlatılacak.");
                        Application
.Restart();
                    }
                }
               
else
               
{
                    MessageBox
.Show("Güncelleştirme bulunamadı.");
                }
            }
            catch
(Exception ex)
            {
                MessageBox
.Show("Uygulama güncelleştirirken hata oluştu." + ex.Message);
            }
        }

        Bu noktada karşılaştığım bir problemden bahsetmekte fayda var.
Uygulamamın bu buton ile update kontrolünü yapması ve kendisinin update için check etmemesi için publish ekranındaki Updates butonuna tıkladığımda açılan formda "The application should check for updates" checkbox’ındaki check’i kaldırdım. Sonrasında uygulamamı publish ettim ve web sayfasından yeni versiyonu yükledim. Çalıştırdığımda ise aşağıdaki hatayı aldım:


        Application cannot be updated programmatically unless the deployment manifest includes the <deploymentProvider> element.
       
        Bu hatanın oluşmasını engellemek için ise yapmanız gereken yine Updates ekranındaki Update Location alanına gidip bir lokasyon yazmanızdır. Bir önceki makalemde bu alana publish lokasyonundan farklı bir lokasyonda uygulamamızı update etmek istersek giriş yapabileceğimizi yazmıştım fakat bu sorunla karşılaşırsanız çözümü bu alana ister aynı publish lokasyon adresini ister başka bir adresi yazmak, uygulamanızı yeniden publish etmek ve web sayfasından kurmak olacaktır.

Şimdi sırada formdaki diğer buton yardımıyla uygulamamızın ClickOnce özelliklerini almaya geldi:

    private void btnClickOnceAyarlari_Click(object sender, EventArgs e)
        {
            ApplicationDeployment
ad;
            ad = ApplicationDeployment.CurrentDeployment;
            lblYukluVersiyon.Text = "Yüklü Versiyon: " + ad.CurrentVersion.ToString();
            lblGuncellenenVersiyon.Text = "Güncellenen Versiyon: " + ad.UpdatedVersion.ToString();
            lblUpdateLocation.Text = "Güncelleme Lokasyonu: " + ad.UpdateLocation.ToString();
            lblEnSonVersiyonCheckTarihi.Text = "En Son Versiyon Kontrol Tarihi: " + ad.TimeOfLastUpdateCheck.ToString();
            lblFirstRun.Text = "İlk Çalıştırılma Mı?: " + ad.IsFirstRun.ToString();
        }

 Artık uygulamamızı publish edip çalıştırabiliriz. "Güncelleme Var Mi?" butonuna bastığımızda yeni bir güncelleme olmadığına dair mesaj çıkacaktır. "ClickOnce Ayarlarını Göster" butonuna bastığımızda ise formdaki labellarda aşağıdaki gibi bilgiler görülecektir.



        Uygulamamızı bir daha publish edip çalıştırdıktan sonra "Güncelleme Var Mı?" butonuna tıklarsak yeni bir versiyonunun mevcut olduğuna ve kurmak isteyip istemediğimize dair bir messagebox çıkacaktır.



        Onayladıktan sonra uygulamanın son hali indirilir ve kurulur.

        Bu makalemde System.Deployment.Application namespace'i ile clickonce uygulamalarımızda bazı özellikleri ve metodları nasıl kullanacağımızı inceledik. Umarım faydakı bir makale olmuştur.

        Işıl ORHANEL.