Merhabalar,
 
         Geliştirdiğimiz Windows tabanlı uygulamaların
dağıtımlarını ClickOnce teknolojisi kullanarak daha rahat ve sorunsuz bir şekilde gerçekleştirebiliriz. Bu makalemde ClickOnce teknolojisi hakkında bilgi vereceğim ve örnek bir ClickOnce uygulaması üzerinden ClickOnce teknolojisi ile yapılabilecekleri anlatacağım.

         Windows uygulamalarında güncelleme yapılırken kullanıcı tüm uygulamayı kaldırıp yeniden kurmak durumunda kalır. Ayrıca eğer kullanıcı bilgisayarda admin değilse uygulama kurma haklarına sahip olmadığından uygulamayı kuramaz. Eğer uygulama birden fazla makinaya kurulacaksa, exe dosyasının her makinaya ayrı ayrı yüklenmesi gerekir. Kurulan veya kaldırılan bir uygulama çalışmakta olan diğer uygulamanın dll’lerini silerek veya değiştirerek uygulamanın çalışmamasına neden olabilir veya sonradan kurulan bir uygulama bizim geliştirdiğimiz uygulamaya biraz önce bahsettiğim şekilde bir etkide bulunabilir. Bunlar ve bunlar gibi karşılaşılması olası problemler yüzünden Windows uygulamaları yerine web uygulamaları geliştirmek gibi bir çözüme gidilebilir ancak ClickOnce daha pratik bir çözüm sağlamaktadır. ClickOnce Windows projelerinin esnekliğini web projelerinin kolay dağıtılabilirliğiyle birleştiren bir teknolojidir. Çünkü biraz önce yazdığım Windows uygulaması geliştirmenin dezavantajlarını ClickOnce kullanarak uygulamanızı publish ettiğinizde yaşamazsınız. Geliştirilen uygulama ClickOnce ile bir web server’dan, ağ üzerinde paylaşılan bir yerden veya CD’den kullanıcılara dağıtılabilir. Uygulama client’lara kurulabildiği gibi, makinaya kurulum yapmaya gerek olmadan herhangi bir ağ yolundan da çalıştırılabilir. Böylece kullanıcının bilgisayarında cache’lenir ancak kurulumu yapılmaz. Uygulama güncellemelerinin olup olmadığı belirlenen zamanlarda veya uygulamanın her çalıştırıldığında kontrol edilebilir. Uygulamanın yüklü olması gereken en alt versiyon, yapılan güncelleştirmenin kullanıcı tarafından kurulmasının zorunlu olup olmadığı gibi seçenekler de ClickOnce teknolojisi sayesinde çok kolay bir şekilde ayarlanabilir.



         ClickOnce ile deploy edilen uygulamalarda iki adet XML dosyası bulunur. Bu dosyalar application manifest ve deployment manifest dosyalarıdır. Application manifest dosyası uygulamayı geliştiren kişi tarafından oluşturulur ve uygulama ile ilgili dosyaların, gerekli izinlerin, güncelleştirme ayarlarının tutulduğu dosyadır. Deployment manifest dosyası ise uygulamanın nasıl deploy edileceği bilgisinin, uygulamanın çalışacağı en düşük versiyon bilgisinin ve uygulamanın referans aldığı kütüphanelerin tanımlandığı dosyadır. Publish Wizard kullanılarak application ve deployment manifest dosyaları oluşturulabilir. Uygulama deploy edildikten sonra dosyalar belirlenmiş olan web server, CD veya paylaşımdaki bir yere kopyalanır. Application manifest ve uygulama dosyaları da deployment manifest dosyasının içinde belirtilen yerlere kopyalanırlar.



         Şimdi örnek bir uygulama oluşturalım, yeni versiyonlarını oluşturalım ve her farklı versiyonu ClickOnce ile publish edelim.


İlk versiyona hiçbir şey eklemeden uygulamamızı deploy edelim.
       

        ClickOnce ile uygulamamızı ilk kez deploy etmek için oluşturmuş olduğumuz projemize sağ tıklayarak Properties penceresini açıyoruz:


  Açılan ekranda sol tarafta bulunan sekmelerden Publish ‘e basarak projemizin ClickOnce ayarlarının yapılacağı ekranı açıyoruz:

Bu ekrandaki Publish Location alanındaki Publishing Location uygulamanın son versiyonuna ait dosyaların ve uygulamanın son versiyonunun nereye kopyalanacağı bilgisinin, Installation URL ise uygulama kurulumunun online olarak indirilebileceği adres bilgisinin girildiği alanlardır.

         Ekrandaki Install Mode and Settings alanında ise iki adet radiobutton bulunmaktadır. “The application is available online only” seçeneği seçilirse kullanıcı uygulamayı sadece yukarıda belirtilmiş olan Installation URL’e erişerek çalıştırabilir. Uygulama Start menüsüne ve Add/Remove Programs listesine eklenmez, sadece cache’lenerek çalıştırılır. Uygulama diğer bir seçenek olan “The application is available offline as well (launchable from Start menu)” seçilerek publish edilirse, kullanıcının uygulamayı çalıştırması için Installation URL’e erişmesine gerek kalmaz, uygulama Start menüsü altına  ve Add / Remove Programs listesine eklenir ve Start menüsü üzerinden erişilerek çalıştırılabilir.

         Bu alandaki dört adet buton ve ne işe yaradıkları aşağıda açıklanmıştır:
 

           Application Files:
          
Application Files ekranında uygulamanın bileşenleri (dll, exe vs) listelenir ve kullanıcı bu bileşenlerin publish status ve download group ayarlarını yapar. Publish status, bileşenlerin uygulama publish edilirken uygulama ile beraber publish edileceğini (Include(Auto)) veya bu bileşenlerin uygulamanın çalışması için bir gereklilik olduğunu (Prerequisite) veya uygulama kurulumuna dahil edilmeyeceğini (Exclude) belirtir. Bu ekranda listelenen öğelerden uygulamanın .exe veya varsa .config dosyasının publish status’u ve download group’u değiştirilemez.



Ayrıca projemize eklemiş olduğumuz dll dosyalarının refereranslarının CopyLocal özellikleri True olarak ayarlanmışsa, dll (Include(Auto)) olarak işaretlenir ve kurulumda uygulamanın klasörüne kopyalanır. CopyLocal özelliği False ise dll’in kurulumdan önce GAC’e eklenmiş olması veya developer tarafından el ile Include durumuna getirilmiş olması gerekir:

Prerequisities:
         Uygulamamızın çalışması için gerekli olan araçları bu ekrandan işaretlediğimizde, uygulamamız kurulmadan önce seçili olan gerekli dosyalar makinada kurulu değilse öncelikle onların kurulumu tamamlanır ve sonrasında uygulama kurulumu başlar.

Ekrandaki listenin altında yeralan 3 radiobutton ise bu araçların nereden yükleneceğini seçtiğimiz alandır. Bu radiobutton’lardan bize uyanı seçerek uygulama için gerekli bu araçların, dosyaları yayınlayan firmanın web sitesinden, uygulamamızın publish edildiği lokasyondan veya bizim belirlediğimiz bir lokasyondan indirilmesini sağlayabiliriz. Ben örnek projemizde bu araçların uygulamamızın publish edildiği lokasyondan indirilmesi seçeneğini işaretledim:


Updates:
        Updates ekran
ında uygulamamızın güncelleştirmelerinin olup olmadığının kontrol edilmesi veya edilmemesi, eğer ediliyorsa uygulama çalıştırıldıktan sonra mı önce mi kontrol edileceği, hangi sıklıkta güncelleştirmelerin kontrol edileceği, uygulamanın çalışacağı minimum versiyon ayarının yapılması ve publish edilen lokasyondan farklı olarak bir de update lokasyonu kaydedilmesi bu ekrandan yapılır.



Options:
        Bu ekranda çeşitli publish seçeneklerini ayarlayabiliriz. Ekrandaki Publisher name alanı program kurulduktan sonra Start – Programs altındaki menüde görülecek isimdir. Product name ise uygulamanın menüsünün altında görülecek olan uygulamanın kendisinin adıdır.



Options ekranında ayarlanabilecek diğer önemli bir özellik de uygulamamızın client’lar tarafından kurulurken kurulacak olan dizindeki hangi sayfadan bu kuruluma ulaşılacağının ayarlandığı yer olan Deployment web page özelliğidir. Deployment web page varsayılan olarak publish.htm olarak adlandırılmıştır, fakat bu ekrandan varolan başka bir sayfa ile değiştirilebilir.

        Publish ekranındaki başka bir alan da Publish Version alanıdır. Burada yer alan checkbox’ı işaretlediğimizde her deployment’ta uygulamamızın versiyonu otomatik olarak 1 artar. Istersek textbox’lara kendimiz de versiyon numarasını yazarak deployment’tan once versiyonu belirleyebiliriz.


Bütün bu ayarlardan sonra artık uygulamamız publish edilmeye hazır hale gelir ve ekrandaki Publish Now butonuna basarak uygulamamızı publish edebiliriz.

Şimdi ise alternatif bir publish yöntemini inceleyecek ve daha sonrasında örnek bir uygulamamızı deploy edeceğiz ve gelişmiş özellikleri inceleyeceğiz.


        Şimdi size uygulamalarınızı publish edebileceğiniz alternatif bir yöntemden bahsedeceğim. Uygulamamızı Publish ekranı yerine projemize sağ tıkladığımızda açılan Publish… menü öğesi ile veya yine Publish ekranında yeralan Publish Wizard… butonunu kullanarak da publish edebiliriz:





Publish’e tıkladığımızda ilk olarak bize uygulamamızın dağıtımının yapılacağı web adresi, ftp adresi veya dosya yolunun girileceği ekran çıkar:


 



Next’e basıp ilerlediğimizde ise uygulamanın biraz önce de belirttiğim gibi belirli bir lokasyona erişilerek mi (online) veya client bilgisayarlara kurularak mı (offline) çalışacağı seçilir:


 



Son ekrana geldiğimizde ise artık uygulamamız publish edilmeye hazır hale gelir ve Finish butonuna tıkladığımızda publish edilir:


 



Publish işlemi başladığında ClickOnce Belirttiğimiz Publish Location altına uygulamanın adını taşıyan yeni bir dizin oluşturur ve gerekli dosyaları bu konuma upload eder. Oluşturulan dosyalar aşağıda görüldüğü gibidir:


 




.application uzantılı XML dosyalar uygulamanın ilgili versiyonunun indirileceği adresin bilgilerini tutar:

<description asmv2:publisher=”BilgeAdam” asmv2:product=”ClickOnceUygulama” xmlns=”urn:schemas-microsoft-com:asm.v1″ />
<deployment install=”true” mapFileExtensions=”true”>
    <subscription>
        <update>
            <beforeApplicationStartup />
        </update>
    </subscription>
    <deploymentProvider codebase=”http://isilo/ClickOnceUygulama/ClickOnceUygulama.application” />
</deployment>

        publish.htm dosyası uygulamanın ve uygulamayı kurmadan önce sistemde kurulu olması gereken bileşenlerin kurulumlarına ait linklerin olduğu sayfadır.

         setup.exe dosyası ise uygulamanın kurulum dosyasıdır.

        ClickOnceUygulama_1_0_0_0 klasöründe ve her versiyon artırımında versiyon numarasına göre isimlendirilip yeniden oluşacak olan bu klasörde ise uygulamanın ilgili versiyonunun dosyası ve application manifest dosyası bulunur.

        Uygulama upload edildikten sonra oluşturulan publish.htm sayfası otomatik olarak açılır:


Sayfadaki Install butonuna basıldığında güvenlik uyarısı gelebilir. Install butonuna basıp devam ettiğimizde uygulama bilgisayarımıza kurulmuş olacaktır ve Start menüsü altından çalıştırılabilir.

        İkinci versiyonda ise uygulamamıza tıklandığında “Merhaba” şeklinde messagebox gösteren bir buton ekleyelim ve yeniden publish edelim. Uygulamamızı publish ettikten sonra ilk çalıştırmak istediğimizde aşağıdaki uyarı mesajı görüntülenir:


 



Bu ekran uygulamamızın yeni versiyonunun yüklenmesi için onay verilmesi gereken ekrandır. OK butonuna basıldığında uygulamanın güncelleştirilmesi yapılır ve en son versiyon client’a kurulur:



  Proje özelliklerine tıkladığımızda açılan ekrandaki Signing sekmesi ile uygulamamızı imzalamamız gerekir. Bu ekranda uygulamanın manifest dosyalarını imzalamak zorunludur, eğer istenirse assembly de imzalanabilir:


 



Ekranın ilk kısmında yeralan Sign the ClickOnce manifests alanındaki üç buton yardımıyla uygulamamızı çeşitli şekillerde imzalayabiliriz. Select From Store butonu kullanıcının kayıtlı olan mevcut sertifikaları arasından bir tanesinin kullanılarak belirlenmiş bir süreye kadar (Expiration Date) uygulamanın imzalanmasını sağlar. Select From File mevcut bir .pfx dosyasını kullanarak uygulamanın imzalanmasını sağlar. Create Test Certificate butonu ise uygulamaya özel test amaçlı sertifika oluşturulmasını sağlar.


Şimdi 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.

 

Merhabalar,

        Windows Live Messenger‘ın 8 versiyonuyla gelen bir yenilik olan add-in desteği sayesinde artık biz de kendi add-in’lerimizi yazıp Messenger’da dilediğimiz gibi kullanabileceğiz. Bu makalemde MessengerClient.dll’ini kullanarak nasıl add-in‘lerin nasıl oluşturulabileceğinden bahsedeceğim.

        Windows Live Messenger’da add-in desteği default olarak görüntülenmiyor. Bunun için öncelikle add-in eklememizi-çıkarmamızı sağlayacak olan özelliği registry’de ayarları değiştirerek aktif hale getirmemiz gerekmekte. Bunun için registry’de HKEY_CURRENT_USER\Software\Microsoft\MSNMessenger altına AddInFeatureEnabled adında yeni bir DWORD değeri eklememiz ve değerini 1 olarak kaydetmemiz gerek:


Registry’de bu ayarı yaptıktan sonra artık Messenger’da Tools-Options ekranında aşağıdaki gibi Add-ins sekmesini görebiliyor olmanız gerekir:

Bu ekranı add-in’imizi yazdıktan sonra Messenger’a eklemek için kullanıyor olacağız.

İlk olarak MessengerClient kütüphanesindeki belli başlı öğeler ve ne işe yaradıkları hakkında bilgi verip, ardından örnek kodlarla add-in’imizi oluşturacağım.

Messenger Client kütüphanesi aşağıda görüldüğü gibi AddInProperties, IncomingTextMessageEventArgs, MessengerClient, OutgoingTextMessageEventArgs, StatusChangedEventArgs ve User class’larından oluşmaktadır.

AddInProperties class’ı aşağıdaki öğelerden oluşur:

Creator(String) Add-in’i oluşturan kişi veye şirket bilgisi  
Description(String) Add-in’in ne işe yaradığı gibi açıklama bilgileri.
FriendlyName(String) Add-in’in adı.
PersonalStatusMessage(String) Messenger kullanıcısının kişisel ileti mesajı
Url(Uri) Add-in i yazan kişi veya şirketin internet adresi
UserTile(Image) Messenger kullanıcısının görüntü resmi


MessengerClient class’ı aşağıdaki öğelerden oluşur:

AddInProperties(AddInProperties)   Çalışan add-in’in özelliklerini taşıyan AddInProperties objesi.
LocalUser(User) Add-in’i çalıştıran kullanıcının özelliklerini taşıyan User nesnesi
SendActionMessage Kullanıcının nudge göndermesini sağlayan metod
SendTextMessage Kullanıcının text mesajı göndermesini sağlayan metod
IncomingTextMessage Mesaj alındığında kullanılabilecek event.
OutgoingTextMessage Mesaj gönderilirken kullanılabilecek event
ShowOptionsDialog Handle edildiği zaman Messenger’ın add-in penceresindeki Settings ile ulaşılabilecek ayarların yapılmasını sağlayan event
Shutdown Add-in kapatılırken kullanılabilecek event.
StatusChanged Kullanıcının veya kontaklarından birinin status’u değiştiğinde kullanılabilecek event.


IncomingTextMessageEventArgs class’ı aşağıdaki öğelerden oluşur:

TextMessage(string) Mesajın text’i.
UserFrom(User) Mesajı gönderen kişinin özelliklerini taşıyan User nesnesi.

OutgoingTextMessageEventArgs class’ı aşağıdaki öğelerden oluşur:

TextMessage(string) Mesajın text’i
UserTo(User) Mesaj gönderilecek kişinin özelliklerini taşıyan User nesnesi.

StatusChangedEventArgs class’ı aşağıdaki öğelerden oluşur:

User(User) Online, busy gibi kullanıcı status’u değişen kullanıcının özelliklerini taşıyan User nesnesi.
GetGroupNames(String[]) User nesnesinin dahil olduğu grupları getiren metod.
Email(string) User nesnesinin e-mail adresi
FriendlyName(string) User nesnesinin kullanıcı ismi.
PersonalStatusMessage(string) User nesnesinin görüntü mesajı.
Status(UserStatus) User nesnesinin durumu.
UniqueId(string) Kullanıcının tekil bir değişkeni

UserStatus ise online, busy, away gibi kullanıcı statuslarını taşıyan enum’dur.

Şimdi sıra bu incelediğimiz konuları daha pratik bir şekilde görebilmemiz için projemizi oluşturup, add-in’imizi yazmaya geldi. İlk olarak yeni bir Class Library projesi oluşturuyoruz ve projemize Program Files\MSN Messenger altında bulunan MessengerClient.dll’inin referansını veriyoruz:


Bu adımda önemli bir noktaya değinmek gerek. Projemizin assembly name’ini assembly.info dosyasından class’ın fully qualified adı şeklinde belirtmeliyiz. Aksi taktirde add-in’i messenger’a eklemeye çalıştığımızda aşağıdaki hata ile karşılaşmamız olasıdır:

Örnek projemizde namespace ve class’larımız MsgrAddIn adına sahipler. Bu yüzden assembly name’i MsgrAddIn.MsgrAddIn şeklinde olmak zorundadır.


Sırada Microsoft.Messenger namespace’ini classımıza using ile tanımlamak ve IMessengerAddIn interface’ini implement etmek var:

using Microsoft.Messenger; //!

namespace MsgrAddIn


class
MsgrAddIn : IMessengerAddIn
{
MessengerClient
_msnClient = null;

             #region IMessengerAddIn Members

             public void Initialize(MessengerClient messenger)
{
_msnClient = messenger;
}

             #endregion
}
}

    Artık yarattığımız add-in’e çeşitli özellikler ve fonksiyonlar kazandırabiliriz. Öncelikle add-in’in bazı özelliklerini set etmemizi sağlayacak kodu Initialize metodunun içine yazalım:

     public void Initialize(MessengerClient messenger)
{
_msnClient = messenger;
_msnClient.AddInProperties.Creator = “IsilOrhanel”;
_msnClient.AddInProperties.Description = “Messenger AddIn”;
_msnClient.AddInProperties.FriendlyName = “MsgrAddIn”;
_msnClient.AddInProperties.PersonalStatusMessage = “Ilk Add-In Olusmaya Basladi…:)”;
_msnClient.AddInProperties.Status = UserStatus.Busy;
}

    Bu kod bloğunda add-in çalıştığı anda kullanıcının kişisel iletisi Ilk Add-In Olusmaya Basladi…:) ve durumu meşgul olacak şekilde değişecektir.

Bu pencereden MsgrAddIn.MsgrAddIn dll’ini seçtikten sonra add-ins penceresinde yazmış olduğumuz add-in seçili hale gelir:

 

Add-in’i ekledikten sonra aktif hale geçmesi için menüde yeralan Turn on “MsgrAddIn” seçeneğini işaretlemeliyiz.

 

Artık oluşturduğumuz add-in sorunsuz bir şekilde çalışmaya başlayacaktır ve Add-in aktif durumdayken ileti pencerelerinde aşağıdaki mesaj görüntülenir:


Şimdi de bazı örneklerle MessengerClient nesnesinin event’lerini inceleyelim. İlk olarak örneğin StatusChanged event’inde hangi kullanıcının saat kaçta hangi status’a geçtiğini messagebox’ta gösteren kodu yazalım. Initialize metodunun içinde aşağıdaki kodu ekleyelim:

    public void Initialize(MessengerClient messenger)
{
_msnClient = messenger;
_msnClient.StatusChanged += new EventHandler<StatusChangedEventArgs>(_msnClient_StatusChanged);
}

Ardından da event handler içine aşağıdaki kodu yazalım:

    void _msnClient_StatusChanged(object sender, StatusChangedEventArgs e)
{
MessageBox
.Show(“Saat: “ + DateTime.Now + ” / Kullanici: “ +  e.User.FriendlyName + ” / Status: “ +  e.User.Status.ToString() + ” olarak değişti.”);
}

Kodu derleyip çalıştırdıktan sonra listemizdeki kişilerin durumu ve kendi durumumuz değiştikçe aşağıda görüldüğü gibi messagebox’lar çıkacaktır:

Şimdi de listemizdeki kişilerden mesaj aldığımızda kullanabileceğimiz IncomingTextMessage event’i ile ilgili bir örnek yapalım. Eğer durumumuz OutToLunch ise add-in’imiz mesaj gönderen kişiye titreşim ve öğle yemeğindeyim mesajı göndersin. Bunun için yine ilk olarak add-in’in Initialize metoduna aşağıdaki kodu ekleyeceğiz:

  public void Initialize(MessengerClient messenger)
{
_msnClient = messenger;
_msnClient.IncomingTextMessage += new
EventHandler<IncomingTextMessageEventArgs>(_msnClient_IncomingTextMessage);
}

Sonrasında ise metodda aşağıdaki kodu kullanacağız:

void _msnClient_IncomingTextMessage(object sender, IncomingTextMessageEventArgs e)
{
if
(_msnClient.LocalUser.Status == UserStatus.OutToLunch)
{
string
outToLunchMessage = “Öğle yemeğindeyim…..:)”;
_msnClient.SendNudgeMessage(e.UserFrom);
_msnClient.SendTextMessage(outToLunchMessage, e.UserFrom);
}
}

Add-in’i çalıştırıp durumumuzu OutToLunch olarak set edersek, bize bir mesaj geldiğinde add’inimiz devreye girecek ve titreşim ve mesajı gönderecektir:

Şimdi ise OutgoingTextMessage event’ini kullanarak üst üste mesaj gönderip gönderilmediğini denetleyen bir örnek yazalım. İlk olarak Initialize metoduna aşağıdaki kodu ekleyeceğiz:

public void Initialize(MessengerClient messenger)
{
_msnClient = messenger;
msnClient.OutgoingTextMessage += new EventHandler<OutgoingTextMessageEventArgs>(_msnClient_OutgoingTextMessage);
}

Ardından da metoda aşağıdaki kodu yazacağız:

_ Hashtable ht = new Hashtable();

void _msnClient_OutgoingTextMessage(object sender, OutgoingTextMessageEventArgs e)
{
if
(ht.ContainsKey(e.UserTo.Email) && e.TextMessage == ht[e.UserTo.Email].ToString())
{
if
(MessageBox.Show(“Bir önce yazdığın mesajı tekrar göndermek istediğine emin misin?”, “Uyarı”, MessageBoxButtons.YesNo)==DialogResult.No)
{
e.Cancel = true;
return
;
}
}
if
(ht.ContainsKey(e.UserTo.Email))
{
ht[e.UserTo.Email] = e.TextMessage;
}
else

{
ht.Add(e.UserTo.Email, e.TextMessage);
}
}

Yukarıdaki kod bir hashtable’da mesaj gönderilen kişinin e-mail adresini ve gönderilen mesajı saklıyor ve her mesaj gönderildiğinde gönderilen mesaj text’ini bir önceki mesaj text’i ile değiştiriyor. Böylece kullanıcı üst üste iki kere aynı mesajı yazıp gönderdiğinde kullanıcıyı uyarıyor:


Biz hayıra basıp mesaj gönderme işlemini iptal edersek ileti penceresinde aşağıdaki şekilde bir mesaj görürüz:

Son olarak add-in’imizde çeşitli ayarlamaları yapabileceğimiz bir form oluşturalım. Örnek olarak kullanıcının status’u away olduğu zaman listesindeki kişilerden mesaj geldiğinde otomatik cevap verecek olan away mesajının set edilmesini sağlayalım. İlk olarak add-in projemize yeni bir Windows formu ekleyelim ve forma textbox ve buton koyalım:

Formun arkasina aşağıdaki kodu yazalım:

    public partial class frmAddInSetting : Form
{
public
frmAddInSetting()
{
InitializeComponent();
}
private
string _message; //string turunde bir degisken tanimliyoruz..
public string message
{
get
{ return _message; }
set
{ _message = value; }
}
private
void btnOK_Click(object sender, EventArgs e)
{
this
._message = txtMessage.Text; //.. ve degiskene textbox’daki degeri atiyoruz.
this.DialogResult = DialogResult.OK;
}
}

Şimdi sıra add-in’imizin ayarlar penceresi açıldığında nasıl davranacağını yazacağımız koda geldi. Yine Initialize metoduna aşağıdaki kodu ekliyoruz:

  public void Initialize(MessengerClient messenger)
{
_msnClient = messenger;
_msnClient.ShowOptionsDialog += new EventHandler(_msnClient_ShowOptionsDialog);
}

ShowOptionsDialog metodunda ise aşağıdaki gibi kod oluşturuyoruz.

string AwayMessage = “”;
void
_msnClient_ShowOptionsDialog(object sender, EventArgs e)
{
frmAddInSetting
settings = new frmAddInSetting(); //yeni olusturdugumuz formun instance’ini aliyoruz
if (settings.ShowDialog() == DialogResult.OK)
{
AwayMessage = settings.message; //class level tanimlamis oldugumuz degiskene formdan gelen string degiskenin degerini atiyoruz.
}
}

Artık messenger’ın add-in eklememizi sağlayan ekranından add-in ayarlarına tıkladığımızda yeni oluşturduğumuz form açılacaktır ve textbox’a yazdığımız mesaj away durumuna geçtiğimizde set edilecek olan mesaj olacaktır.

Son adımda ise add-in’in IncomingTextMessage metoduna aşağıdaki kodu yazdığımızda away durumuna geçtiğimizde bize mesaj gönderen kişilere otomatik olarak add-in’in ayarlarında yazmış olduğumuz text’in gitmesini sağlayacak kodu yazalım:

void _msnClient_IncomingTextMessage(object sender, IncomingTextMessageEventArgs e)
{
if
(_msnClient.LocalUser.Status == UserStatus.Away)
{
_msnClient.SendTextMessage(AwayMessage, e.UserFrom);
}
}

Artık biz away durumundayken mesaj geldiği zaman messenger aşağıdaki gibi davranacaktır:

 


Makalemin ilk bölümünün sonunda add-in yazarken karşılaşma olasılığınızın çok yüksek olduğu bir hata mesajından bahsetmek istiyorum. Eğer yazmış olduğunuz add-in messenger’ınızda çalışıyorken siz mevcut add-in’de bir değişiklik yapıp tekrar derlemeye çalışırsanız aşağıdaki hata ile karşılaşabilirsiniz:

“Unable to copy file “obj\Debug\MsgrAddIn.MsgrAddIn.dll” to “bin\Debug\MsgrAddIn.MsgrAddIn.dll”. The process cannot access the file ‘bin\Debug\MsgrAddIn.MsgrAddIn.dll’ because it is being used by another process.”

Bu hatayı aldığınızda yapılacak şey messenger’ı kapatmak ve kodu derledikten sonra messenger’ı tekrar açmak olacaktır. Derlemiş olduğunuz dll’in yeni halini ekleyip, add-in’i aktif hale getirdikten sonra da add-in’iniz sorunsuz çalışıyor olacaktır.

Bu makalemde Messenger.Client nesnesi ile Messenger’da yapabileceğimiz şeylere bazı örnekler verdim. Her ne kadar bazı zamanlarda dll ile yapmak istediğiniz şeyler sınırlansa da messenger’a fonksiyonalite katması açısından başka şeyler de yapılabileceğine inanıyorum ve bunları ilerleyen zamanlarda başka makalelerimde sizlerle paylaşıyor olacağım. Son olarak makalemi yazarken ve kodu test ederken mesaj gönderme, status değiştirme gibi işlemleri her rica edişimde bıkmadan yapan ve yardımlarını esirgemeyen Tamer Öz’e teşekkürlerimi sunarım.

Işıl ORHANEL