Makale Özeti

Yazılım geliştiriciler, uygulamalarını geliştirirken çalışma zamanında(run-time) uygulama içerisinden başka bir assembly çağırma ihtiyacını sık sık duyarlar. Bu noktada dışarıdan çağırılan assembly ler çalışırlarken bizim için yeterince izole edilmiş bir şekilde çalışmazlar ve aynı zamanda üzerinde çalıştığı uygulamanın kaynaklarını performanslı bir şekilde tüketmezler. Bu sorunları yönetmemiz için .Net Framework alt yapısı bizlere uygulama alanlarını(application domains) sunmuştur.

Makale

Uygulama Alanları(Application Domains)

Yazılım geliştiriciler, uygulamalarını geliştirirken çalışma zamanında(run-time) uygulama içerisinden başka bir assembly çağırma ihtiyacını sık sık duyarlar. Bu noktada dışarıdan çağırılan assembly ler  çalışırlarken bizim için yeterince izole edilmiş bir şekilde çalışmazlar ve aynı zamanda  üzerinde çalıştığı uygulamanın kaynaklarını performanslı bir şekilde  tüketmezler. Bu sorunları yönetmemiz için .Net Framework alt yapısı bizlere uygulama alanlarını(application domains) sunmuştur.

 

Neden Uygulama Alanları?

                Uygulama alanı tek işlem(process) içerisinde birden fazla assembly i çalıştırabilen mantıksal  alanlardır. Bu işlev sayesinde içerisinde çalıştırdığı uygulamalara bellekten başka bir assembly  tarafından direkt erişimi engellemiş olurlar böylelikle içerisinde bulundurdukları uygulamaları bir bakıma izole etmiş olurlar.

                Uygulama alanları, assembly lere çeşitli ortamlar sunar. Bunlardan birincisi Ayrık Bellek Alanı ve diğeri Kaynak Erişimidir.Aşağıda da görüldüğü gibi tek bir işlem(process) içerisinde iki uygulama alanı çalışmakta ve bu uygulama alanlarından birincisi kendi içerisinde iki assembly barındırmakta. Tek bir işlem(process) içerisinde birden fazla assembly nin çalışması diğer yönteme göre(direkt olarak dışarıdaki bir assembly çalıştırma yöntemi) daha verimli olmaktadır.

                Bunula ilgili verebileceğimiz en güzel örnek Aspnet_wp.exe tarafından yürütülen IIS(Internet Information Services) 5.0’ın ASP.NET işlemleridir(worker process). 10 kişi ASP.NET web sitesini eş zamanlı olarak ziyaret ettiğinde, ASP.NET her kişi için ayrı uygulama alanı oluşturur. Aslında aynı assembly nin 10 farklı örneği çalışır.

                Aspnet_wp.exe assembly e ait birden fazla örneği içerisinde izole edebilir. Sonuc olarak kendi uygulama alanınızı(Application Domain) daha az risk alarak, daha kaynaklarınızı daha verimli tüketerebilirsiniz. Aşağıdaki şekilde uygulama alanının birden fazla uygulama alanını üzerinde barındırabileceğini görüyoruz.

 

Şöyle bir özel çıkartacak olursak;

Uygulama alanları bize güvenilirlik ve verimlilik konularında bir arttırım sağlar.  

Güvenilirlik : İşlemleri(process) izole ediyoruz. Assembly yüklendikten sonra başka bir işlem yüklenen assembly’e etki edemiyor. Bunların yanı sıra eğer bir veriyi paylaşmak istemiyorsanız yine uygulama alanlarını kullanmanız faydalı olacaktır.

Verimlilik : Eğer bir assembly uygulama alanını içerisine yüklenirse, işlem devam ettiği sürece bellekten kaldırılamaz. Uzun süren işlerin kullanımını minimize etmek için uygulama alanlarını kullanmak başarılı bir yöntemdir. Genelde bu örnek büyük dll’ler için geçerlidir.

System.AppDomain

Özellikleri

CurrentDomain

O anki uygulama alanına erişmemize yarar. CurrentDomain sayesinde mevcut  thread i kontrol edebiliriz ve izinleri doğrulayabiliriz.

 

Evidence

Bu özellik sayesinde uygulama alanı içerisindeki assembly e nereden erişileceğini ve bununla ilgili güvenlik ayarlarını yapabiliyoruz.

 

FrendlyName

Uygulama içerinde bir uygulama alanı oluşturmak isterseniz FrendlyName özelliğini mutlaka belirtmelisiniz. FriendlyName uyglamanız içerisnde çalışacak olan uygulama alanının hangi isimle çalışacağını belirlediğimiz  özelliktir.

 

Id

İşlem(process) içerisindeki uygulama alanının id’sini verir.

Metodları

ApplyPolicy

Assembly e ile igili güvenlik ayarları uygular, sonra Assembly’nin gösterilen adını verir.

 

CreateDomain

AppDomain sınıfının yapıcı metodunu kullanmak yerine bu metodu kullanırız. Yeni bir uygulama alanı oluşturur.

 

CreateInstance

Belirtilen assembly içerisinde belirtilen tipte örnek olşurur.

 

ExecuteAssembly

Belirtilen dosya içerisindeki assembly i çalıştırır.

 

ExecuteAssemblyByName

Proje içerisine referans olarak eklenmiş assembly i çalıştırır.

 

GetAssemblies

Çalışma alanı içerisine yüklenmiş assembly leri verir.

 

Load

Uygulama alanı içerisine bir assembly yükler.

 

Unload

Uygulama alanı içerisindeki assembly i kaldırır.

AppDomain Sınıfını Nasıl kullanırız?

AppDomain sınıfını kullanmamızdaki amaç, AppDomain sınıfını kullanarak uygulamamız içerisine dışarıdaki bir assembly i çalıştırmak yada yüklemektir. Bunun için küçük bir console uygulaması oluşturalım ve uygulamaya “MyConsoleApp” adını verelim. Daha sonra bu uygulamayı c: klasörümüzün altına kopyalayalım.

                Şimdi “MyAppDomainDemo” adında bir console projesi başlatalım. Bu proje içerisinde bir uygulama alanı oluşturacağız. Ve bu uygulama alanı içerisnde bir assembly çalıştıracağız.

1-      İlk önce AppDomain sınıfının CreatDomain metodunu kullanarak yeni bir uygulama alanı oluşturalım ve adına “yeni Domain” diyelim.

2-      Daha sonra domain nesnemizin ExecuteAssembly metodunu kullanrak uygulamamız içerisnde uygulamamızın dışında bulunan bir assembly i çağıralım. Çağıracağımız bu assembly c klasörünün altına kopyaladığımız “MyConsoleApp” olacak.

3-      Daha sonra program kapanırken yüklediğimiz assembly i mevcut uygulama alanı üzerinden kaldıracağız.

4-      Şimdi MyAppDomainDemo projesini çalıştıralım.

 

Yukarıda AppDomain sınıfı kullanılarak dışarıdan yüklenmiş bir assembly bulunmaktadır.