C#’ta ClickOnce Deployment İle Uygulamaya Güncelleme Desteği
Merhaba,
Günümüzde bir yazılımın gelişim sürecindeki temel gaye, tüm plan ve algoritmaların gerçekleştirilmesi ve nihai unsur olarak ürünün elde edilmesinden ziyade ürünün inşasından sonraki gelişim sürecini de ilgilendiren durumları hesaba katmak ve yeni güncellemeleri son kullanıcılara bir şekilde duyurabilmek ve ulaştırabilmek için sonuç değil süreç odaklı bir teknik alt yapı geliştirebilmektir.
Yazılım geliştiriciler, üretilen bir yazılımın sonraki versiyonlarını kullanıcı kitlesine eriştirebilmek için birçok teknik ve yöntem geliştirmişlerdir. Tabi ki de bu teknik ve yöntemler; yetenekleri ve kapsamları açısından farklılık arz etmekte ve ihtiyaca dönük çok farklı imkan ve hizmetler sunabilmektedirler.
Bizler bu içeriğimizde bu teknik ve yöntemlerden amacımıza orta ölçekli hizmette bulunabilecek .NET mimarisi tarafından geliştirilmiş ClickOnce Deployment tekniğini inceliyor olacağız. ClickOnce Deployment, üretmiş olduğumuz yazılıma güncelleme desteği vermemizi sağlayabilen ve bunun yanında birazdan ele alacağımız birçok farklı nimeti bünyesinde barındıran bir deployment sistemidir.
ClickOnce Deployment Çalışma Mekanizması
Üretilen yazılımın yeni versiyonlarını kullanıcılara erişilebilir bir sunucu üzerinden ulaştırmaktadır. Yazımızın derinliklerinde de göreceğiniz üzere Visual Studio desteğiyle uygulayacağımız ClickOnce Deployment özelliği, projede olan her yeniliğe özel otomatik artan versiyon bilgisi oluşturmakta ve bu bilgi eşliğinde yazılımın son halini publish ederek ilgili sunucuya aktarmaktadır. Haliyle clienttaki uygulama, sunucudaki üst sürümü anlayabilmek için versiyon numarasını kontrol etmekte eğer yeni bir sürüm varsa kendini güncellemektedir.
ClickOnce Deployment İle Projeyi Publish Etme
Şimdi konuyu bir örnek proje üzerinden detaylıca ele alalım.
Güncelleme desteği vermek istediğiniz projeye “Solution Explorer” penceresinden sağ tıklayarak “Propertys” sekmesine tıklayınız.
Ardından karşımıza çıkan penceredeki sol menüden “Publish” sekmesine tıklayınız.
Şimdi tüm mevzu bu pencere üzerinde ceyran edeceği için yukarıdaki ekran görüntüsünü numaratik olarak parçalara bölmüş bulunmaktayım. Buyrun bu parçaları adım adım detaylandıralım.
- 1. Bölüm
Uygulamayı publish edeceğimiz dizini belirttiğimiz alandır. - 2. Bölüm
Clientların yeni versiyon takibini yaptığı, varsa güncelleme işlemi için dosyalara ulaşacağı alanı belirtiyoruz. Yani yazılımın yayınlanacağı sunucuyu belirtiyoruz. - 3. Bölüm
Bu özellik uygulamayı her açtığınızda arkaplanda öncelikle ilgili sunucuya erişip programı yükleyerek kullanma imkanı tanıyacaktır. Dolayısıyla bu işlem için internet gerektiğinden dolayı ilgili yazılımın sade ve sadece internet bağlantısı olduğu zamanlarda çalışabileceğini belirtmektedir. - 4. Bölüm
Bu özellik ise uygulamayı bilgisayara yükleyecektir. Dolayısıyla yazılım kullanılmak istendiğinde internetten bağımsız hareket edilecek lakin yeni versiyonları kontrol etmek ve yüklemek istediğinizde ise internet bağlantısı gerekecektir. - 5. Bölüm
Bu sekmede, uygulamayı bilgisayara kurarken hangi dosyaların yükleneceğini göstermekte ve ayarlama yapabilmemizi sağlamaktadır. - 6. Bölüm
Bu sekmede ise yazılımı yüklerken ön koşul olarak gereken paketleri belirtebiliyor ve uygulama yüklenmeden önce kâh internet üzerinden kâh dosya yolunu belirtmiş olduğumuz kaynak dosyalar üzerinden gerekli yüklemeleri gerçekleştiriyoruz. - 7. Bölüm
İşte bu seçenek tam da konumuzu ilgilendiren ayarları yani güncelleme ayarlarını bizlere sunmaktadır. Haliyle ilgili seçeneğin penceresini aşağıda ele alıp detaylı değerlendirmek konumuz açısından daha verimli olacaktır.- “a” Bölümü
Uygulamanın güncellemelerini otomatik olarak kontrol edip etmeyeceğini belirlemektedir. Seçilirse edecektir. Seçili değilse yazımızın devamında ele alacağımız gibi manuel olarak güncellemeleri kontrol edeceğiz.Ayriyetten bu seçeneği seçtiğiniz anda “b” ve “c” bölümleri aktifleşecektir. - “b” Bölümü
Uygulama açıldıktan sonra güncellemeleri kontrol edip etmeyeceği belirlenmektedir.Bu seçenek seçildiği taktirde “d” ve “e” seçenekleri aktifleştirilecektir. - “c” Bölümü
Uygulama açılırken güncellemelerin kontrol edilip edilmeyeceği belirlenmektedir. - “d” Bölümü
Uygulama her çalıştığında güncelleştirmeleri kontrol edecektir. - “e” Bölümü
Uygulama belirtilen aralıkta güncelleştirmeleri kontrol edecektir. - “f” Bölümü
Yazılımın versiyon ayarlarını gerçekleştirebiliyoruz. Hatta güncellemelerin yüklenebilmesi için clienttaki uygulamanın minimum hangi versiyonda olması gerektiğini bile ayarlayabiliyoruz. - “g” Bölümü
Eğer ki yazılımın güncelleştirmeleri farklı bir adresten(sunucudan) indirmesini istiyorsak ilgili adresi buraya belirtiyoruz. Bu alan boş kaldığı taktirde 2. bölümdeki alan varsayılan yazılım güncelleme adresi kabul edilmektedir.
- “a” Bölümü
- 8. Bölüm
Burada ise yazılımın publish seçeneklerini ve ayarlarını barındırmaktadır.
Ayrıca sol menüdeki “Deployment” sekmesine tıklarsanız eğer;
“Automatically generate deployment web page after every publish” sekmesini seçerseniz eğer “Deployment web page” kısmında belirtilen isimde bir versiyon bilgisi sunan html dosyası oluşturulacaktır. - 9. Bölüm
Yazılımın versiyon seçeneklerini ayarladığımız alandır. - 10. Bölüm
Bu seçenek seçiliyse eğer uygulamanın her publish olması durumunda 9. bölümdeki “Revision” alanı otomatik olarak 1 arttırılacaktır. Dolayısıyla bu işlemde her publish için otomatik versiyon bilgisi üretmiş olacaktır.
Evet… Bu bilgiler ışığında örnek projemizi, uygulama açılır açılmaz güncellemeleri kontrol edecek şekilde ve aşağıdaki ayarlarda publish edelim.
Burada kendime ait bir web sitesi üzerinden örneklendirme yapmaktayım.
Publish yapar yapmaz otomatik tarayıcıda karşımızdaki web sayfası açılmaktadır.
Yazılımı yükledikten sonra, kapatıp tekrardan açarsanız eğer aşağıdaki gibi başlangıçta sürüm kontrolü yaptığını göreceksiniz.
Ve yaptığınız herhangi bir yenilik doğrultusunda yazılımı tekrardan publish ederseniz aşağıdaki gibi ilgili güncelleme programın ilk çalıştırılmasında fark edilecek ve kullanıcı onaylı başlatılacaktır.
Son olarak otomatik tüm güncelleştirme işlevlerini durdurup kullanıcı bazlı kontrol yapmak istiyorsanız eğer biraz koda bulaşmanız gerekecektir. Dolayısıyla aşağıdaki kod bloğu manuel olarak güncelleştirmeleri kontrol etmenizi sağlayacak yapıyı sizlere sunmaktadır.
try { //ApplicationDeployment, güncelleştirme bilgilerine erişmemizi sağlayacak olan bir sınıftır. ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; //CheckForDetailedUpdate metodu ile güncelleme var mı? yok mu? kontrol ediyoruz. UpdateCheckInfo info = ad.CheckForDetailedUpdate(); if (info.UpdateAvailable) { if (DialogResult.Yes == MessageBox.Show($@"Şu anki versiyonunuz: {ad.CurrentVersion.ToString()} Yeni versiyon: {info.AvailableVersion.ToString()} kullanılabilir durumda. Yüklemek istiyor musunuz?", "Bilgi", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)) { if (ad.Update()) { MessageBox.Show("Program Başarıyla Güncellendi. Şimdi yeniden Başlatılacak."); Application.Restart(); } else MessageBox.Show("Güncelleme Sırasında Hata Oluştu"); } } else MessageBox.Show("Güncelleme bulunmamaktadır."); } catch { MessageBox.Show("Sunucuyla bağlantı sağlanamadı."); }
Bu komutlar eşliğinde programınızın yeni versiyonlarını kontrol edebilir, varsa güncelleyebilirsiniz.
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Sunucu adresini nerde belirtmemiz gerekiyor ? Birde tüm güncellemeleri otomatik yapmasını istiyorsak?
Verileri AppData altına alıyor bir klasör belirtsek?
Birinci sorunun cevabı için;
İkinci sorunun cevabı için;
Makalenin en sonundaki kod bloğuna göz atarsan eğer if kontrolü kaldırılmıştır. Netice olarak yukarıdaki (gibi) bir algoritma işini görecektir.
Son yazdığında ise istediğin müdahalede bulunabilirsin. Nihayetinde şimdi öngöremediğimiz olası patlamaları süreçte kontrol etmen gerekecek.
Kolay gelsin.
komutu yapmaya callstım ama otomatık guncelleme almadı bır turlu :S
Kiralık sunucumda ftp:// siteyi kurdum ve burada bir proglemim yok ancak. Http:// kısmında proglem yaşıyorum. Çözüm için yardımcı olabilir misiniz ? “Clientların yeni versiyon takibini yaptığı, varsa güncelleme işlemi için dosyalara ulaşacağı alanı belirtiyoruz. Yani yazılımın yayınlanacağı sunucuyu belirtiyoruz.” demişsiniz anladığım kadarıyla burada sadece programın “Setup”u oluyor.
İlgili yazılıma dair en güncel versiyonun gerekli dosyaları burada tutulmaktadır.
Merhaba. Söylediğiniz şekilde yaptım. ftp:// adresine pulic now diyince kullanıcı adı ve şifre soruyor bilgileri girdiğim zaman ftp dizinindeki klasöre atıyor sorun yok fakat programı derleyip güncelleme kontrol et dediğimde bağlantı başarısız hatası alıyorum. Sanıyorum ftp giriş bilgilerini de kaydetmem gerekiyor kontrol için bunu nasıl yapacağız?
Tamam bunu şimdi yaptım oldu. Programı yüklemem gerekiyormus güncelleme yapıyor fakat Database kullanıyorum yüklemede sadece exeyi yüklüyor db olmadıgı için aynı dizinde veriler gelmiyor. Nerde saklanıyor kurulum dosyaları bunu nasıl çözebiliriz?
Yazılımsal kaynağı ClickOnce ile taşıyabilirsiniz ama veritabanını taşıyabilmek için ekstradan çalışmalar yapmanız gerekebilir. Bunun için strateji geliştirilmesi yahut daha komplike bir yapılanma kullanılması gerekebiliriz. Araştırılması lazım.
Yüklenen exe tam olarak nerede. DB’i o dizine atsak çalışır diye düşünüyorum. Hedef kaynağı bulamadım.
Dosyalar burada belirtilen dizinde tutuluyor.
Merhaba Gençay bey..
ClickOnce çok avantajlı.. Fakat bazı sorularıma cevap aramaktayım.
Şimdi programı kullanan kullanıcı DB ye sürekli veri giriyor. ClickOnce ile Ftp üzerinden güncelleme aldığı zaman DB ‘si silinecek ve veri kaybı yaşanacak. Bunun için nasıl bir strateji izlenmesi gerekir? Teşekkürler
Merhaba,
Genellikle DB yapılanması yazılımdan ve kaynaktan bağımsız bir şekilde sunucularda barındırıldığından dolayı yazılım güncellemesi veritabanını etkilememektedir. Siz veritabanını nasıl tasarladınız? Eğer ki yazılıma dahil edilmiş bir yapılanması stratejisi uyguluyorsanız veritabanı yapılanmasını mümkün mertebe değiştirmemeniz gerekmektedir. Bunun için istişare etmemiz gerekiyor. Siz durumu izah ediniz. Yapılanmanızı tanıtınız?
Merhaba aynı sorun ile bende karşılaştım….Sorunu nasıl aştınız?
Merhaba app_setting file dosyası oluşturup db connection stringi ve bazı kullanıcı api bağlantı bilgilerini burada tutuyorum. Güncelleme ile bu app_setting dosyasının tekrar güncellememesini nasıl sağlarım veya başka bir yol varmıdır bu gibi durumlar için
Merhaba,
Buna dair araştırma ve deneme yapmak gerekecek. Eğer sorunuza dair çözüm bulursanız lütfen buradan bizi de bilgilendiriniz.
Sevgiler.
Güncelleme olmasını istemediğim dosyalar için farklı bir yol izledim. ‘C:\\App_Name\\appsetting.json’ gibi uygulama klasöründen farklı bir klasör altında tuttum
başka bir çözüm yolu yok maalesef
Merhabalar,konuya girmeden önce ayrıntılı ve güzel anlatımınız için teşekkür ederim.Benim yapmak istediğim bir husus mevcut. Kullanıcıların verileri indirmesine gerek kalmadan yani dosyaları ftp tutarak onlara kısayol veya başka bir exe göndererek client tarzı kullandırma yapmak istiyorum.Ancak herhangi bir bilgiye ulaşamadım. VDS sunucu kiralayarak ta olsa bu şekilde bir işlem yapılabilir mi?
Merhaba,
İsteğinizi tam olarak kavrayamasamda, anladığım kadarıyla bu makaledeki anlatılanları yapmak istiyorsunuz.
Evet konudaki olayı yapabildim sayenizde ancak programın dosyalarını kullanıcıların bilgisayarına indirmesine gerek kalmadan yapılabilir mi?Yaptığım program MSSQL den veri çekmekte.Güvenlik duvarı bulunduğundan izinler sadece sunucuya veriliyor. Hem güvenlik hem de izinler sebebi ile ana dosyaların sunucu da bulunması gibi bir olanağımız mevcut mu?
Kaynak dosyaları sunucuda barındırılıp çalıştırılan uygulamalar web kategorisine girmekte ve yapısal olarak nevi şahsına münhasır bir geliştirme stratejisinde inşa edilmektedirler. Size önerim bu şekilde bir ihtiyacınız varsa uygulamayı web tabanlı bir mimariyle geliştirmenizdir.
Merhabalar, makaleniz doğrultusunda bütün adımları gerçekleştirdim. yayınla butonuna bastığımda “ftp://siteadi.com/guncellemeler adresine bağlanılamadı ve şu hata ile karşılaşıldı. ‘ftp://siteadi.com/guncellemeler’ Web sitesi oluşturulamıyor. Ftp sunucuları ile iletişim kurmak için bileşenler yüklü değil. hatası veriyor bu konuda yardımcı olabilir misiniz ?
Merhaba,
Bu hatayı süreçte almadığım için şimdilik yardımcı olmam pek mümkün değil. Lakin nerede(hangi adımda) aldığınızı bildirirseniz istişare edebilirim.
Tekrardan Merhabalar, Sorunu çözdüm, Eğer yardımcı olabilirseniz başka bir sorunum var uygulamamda access veritabanı bulunmakta, Uygulamaya her sürüm güncellemesi yapıldığında access veritabanı yenileniyor. Ben yeni sürüm yüklendiğinde eski sürümü kullanan kullanıcının veritabanın müdahele edilmesini istemiyorum ve eğer ilk defa kurulum yapıyorsa da access veritabanını kurulmasını istiyorum. Bunu nasıl yapabilirim ?
Merhaba,
Sizden önceki soruna dair benzer sorunu yaşayabilecek diğer arkadaşlar için çözümü açıklamanızı rica ediyorum.
Sorunuza gelirsek eğer;
Access veritabanını publish dosyalarının arasından çıkarmanız ve farklı bir path’de tutmanız yapılan güncelleme durumunda etkilenmemesi için yeterli olacaktır.
kurulumu baska bir yere yapma gibi sansımız varmı
Güncelleme olduğu için sanmıyorum. Ama araştırmakta fayda var.
Merhabalar, visual studio 2019 sürümünü kulllanıyorum, ve kurulumu hızlı yapmak için bazı özellikleri kurmamıştım sdk dosyası eksik kalmış daha fazla özellik yükle diyerek eksik olan sdk kurdum sorun çözüldü.
Geri dönüş için teşekkür ederiz.
merhabalar uygulamaya decexpress eklediğimizde güncelleme yaparken hata alıyorum.
aldığım hata
Tanımlayıcı ad imzası bu DevExpress.Data.v19.2.dll bütünleştirilmiş kodu için geçerli değil.
hatayı çözebildin mi aynı sorun bendede var
sayın hocam zamanınız varsa, uygulamayı publish edip yüklemek istediğimizde (internet explorer da yükleme yapıyorum)
“Uygulama indirilemiyor. Uygulamanın gerekli dosyaları eksik. Yardım için uygulama satıcısına başvurunuz.” şeklinde hata alıyorum. Çözemedik sizden yardım talep ediyoruz.
hata detayı:
*************************************************************
PLATFORM SÜRÜM BİLGİLERİ
Windows : 10.0.18363.0 (Win32NT)
Common Language Runtime : 4.0.30319.42000
System.Deployment.dll : 4.8.3752.0 built by: NET48REL1
clr.dll : 4.8.4180.0 built by: NET48REL1LAST_B
dfdll.dll : 4.8.3752.0 built by: NET48REL1
dfshim.dll : 10.0.18362.1 (WinBuild.160101.0800)
KAYNAKLAR
Dağıtım url’si : http://desktop-qq1d5ef/ddm/WpfApp18.application
Sunucu : Microsoft-IIS/10.0
X-Destekleyen : ASP.NET
Dağıtım Sağlayıcısı url’si : http://desktop-qq1d5ef/ddm/Application%20Files/WpfApp18.application
HATA ÖZETİ
Hataların özeti aşağıdadır; bu hataların ayrıntıları günlüğün sonraki bölümlerinde listelenir.
* http://desktop-qq1d5ef/ddm/WpfApp18.application etkinleştirmesi özel durumla sonuçlandı. Aşağıdaki hata iletileri algılandı:
+ http://desktop-qq1d5ef/ddm/Application Files/WpfApp18.application indirilemedi.
+ Uzak sunucu hata döndürdü: (404) Bulunamadı.
BİLEŞEN DEPOSU İŞLEM HATASI ÖZETİ
Algılanan işlem hatası yok.
UYARILAR
* Bu uygulamanın bildiriminde imza yok. İmza doğrulaması yoksayılacak.
İŞLEM İLERLEME DURUMU
* [13.07.2020 17:11:18] : http://desktop-qq1d5ef/ddm/WpfApp18.application etkinleştirilmesi başlatıldı.
HATA AYRINTILARI
Bu işlem sırasında aşağıdaki hatalar algılandı.
* [13.07.2020 17:11:18] System.Deployment.Application.DeploymentDownloadException (Bilinmeyen alt tür)
– http://desktop-qq1d5ef/ddm/Application Files/WpfApp18.application indirilemedi.
– Kaynak: System.Deployment
– Yığın izleme:
konum: System.Deployment.Application.SystemNetDownloader.DownloadSingleFile(DownloadQueueItem next)
konum: System.Deployment.Application.SystemNetDownloader.DownloadAllFiles()
konum: System.Deployment.Application.FileDownloader.Download(SubscriptionState subState, X509Certificate2 clientCertificate)
konum: System.Deployment.Application.DownloadManager.DownloadManifestAsRawFile(Uri& sourceUri, String targetPath, IDownloadNotification notification, DownloadOptions options, ServerInformation& serverInformation)
konum: System.Deployment.Application.DownloadManager.DownloadDeploymentManifestDirect(SubscriptionStore subStore, Uri& sourceUri, TempFile& tempFile, IDownloadNotification notification, DownloadOptions options, ServerInformation& serverInformation)
konum: System.Deployment.Application.DownloadManager.FollowDeploymentProviderUri(SubscriptionStore subStore, AssemblyManifest& deployment, Uri& sourceUri, TempFile& tempFile, IDownloadNotification notification, DownloadOptions options)
konum: System.Deployment.Application.DownloadManager.DownloadDeploymentManifestBypass(SubscriptionStore subStore, Uri& sourceUri, TempFile& tempFile, SubscriptionState& subState, IDownloadNotification notification, DownloadOptions options)
konum: System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl, Uri& deploymentUri)
konum: System.Deployment.Application.ApplicationActivator.PerformDeploymentActivationWithRetry(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
— Özel durumun oluşturulduğu önceki konumdan başlayan yığın izlemesinin sonu —
konum: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
konum: System.Deployment.Application.ApplicationActivator.PerformDeploymentActivationWithRetry(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
konum: System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)
— İç Özel Durum —
System.Net.WebException
– Uzak sunucu hata döndürdü: (404) Bulunamadı.
– Kaynak: System
– Yığın izleme:
konum: System.Net.HttpWebRequest.GetResponse()
konum: System.Deployment.Application.SystemNetDownloader.DownloadSingleFile(DownloadQueueItem next)
BİLEŞEN DEPOSU İŞLEM AYRINTILARI
Kullanılabilir işlem bilgisi yok.
*************************************************************
web sitesinden pcye yükleme yapmaya çalıştığım zaman 403 forbidden (yasak) hatası alıyorum. Programı kurmuyor. Çözümü nedir?
Merhaba,
Yeni güncelleme olduğunda sertifika ile alakalı güvenlik problemi oluşuyor. Kullanıcı hiç bir işlem yapmadan oneclick altyapısını kullanarak otomatik güncelleme işlemini yapabilir miyiz?
Merhaba,
Doğrusu bende bilemedim. Araştırmak lazım. Sizden ricam sualinize cevap bulursanız lütfen burada bizimle de paylaşmanız…
Sevgiler.
Merhaba, emeğiniz için teşekkürler. Çok faydalı ve önemli bir konu. İyi çalışmalar.
Merhabalar,
Güncelleme yayınladığımda kullanıcılar güncellemeleri yüklerken hangi güncellemelerin olduğunu bilemiyorlar. Bunun için güncelleme sırasında bunları görebilecekleri bir alan olabilir mi ? (release note şeklinde)
Merhaba,
Hocam sıkı takipcinizim.
Ben raporlama üzerine bir windowsform uygulaması üzerine çalışıyordum, uygulamayı otomatik güncelleme yapmak için ilgili makalenizi okudum ama projem .Net 6.0 ve System.Deployment sınıfını bu versiyonu desteklemiyor. Ben projemde manuel olarakda güncelleme işlemi yapmak istiyorum bunu nasıl yapabilirim?
Emeğiniz için teşekkürler hocam. İyi çalışmalar.