C# Application Domains

Application domain işletim sisteminde bulunan process’lere benzetilebilir. Öyleyse process nedir?

Process, çalıştırdığınız uygulamanın bellekte kendine ayrılan bölümü kullanmasını sağlayan ve diğer uygulamaların birbirini etkilememesini sağlayan izolasyon konteynırlarıdır. Her process kendi sanal (virtual) bellek adresine sahiptir ve diğer process’ler bu alana erişemezler. 32 bit Windows işletim sistemlerinde her process uygulamanın yapısına bağlı olarak maksimum 3 GB bellek kullanabilmektedir. Ancak kullandığınız işletim sistemi versiyonuna göre bellek kullanım miktarı farklılık göstermektedir. Aynı şekilde bellek kullanımı 64 bit sistemlerde önemli derecede arttırılmış olup limit yazılımdan ziyade donanımdan kaynaklanmaktadır. Örneğin Windows 7 64 bit’de 192GB a kadar bellek kullanılabilir, Windows Server 2008 64 bit’de bu sınır 2TB’dır.

Application Domain geliştiriciye izolasyon ve güvenlik seviyesi sağlamaktadır. Her .Net Process’i varsayılan olarak bir Application domain’i içinde barındırır. Bu application domain CLR tarafından process’in başlatılması ile otomatik oluşturulur ve gerektiğindede aynı process içinde birden çok Application Domain yaratılabilir. Her application domain kendine ait bellek bölgesine ve güvenlik seviyesine sahip olup böylece process içinde diğer application domain’lerin bellek belgesine erişip birbirlerini kararsız hale getirmesine engel olunmuş olur.

Ayrıca Application domain’lere runtime’da dinamik olarak Assembly’ler yüklenip, istendiğinde yüklenen assembly’e ait kaynaklar bellekten temizlenebilir.

Application domain’e yüklenen assembly’ler deki sınıflar serileştirilebilir (Serializable) olmalı yada MarshalByRefObject sınıfından türemelidir.


Aşağıdaki şekildede görüleceği üzere bir processes içerisinde bir yada birden fazla application domain bir yada birden fazla thread ile çalışabilmektedir :

Application Domains

Application Domain’ler ne zaman kullanılır?

Şu ana kadar Application Domain hakkında bilgi sahibi olduk peki hangi durumlarda kullanacağız? Aşağıdaki durumlar genel anlamda Application Domain kullanımına ihtiyaç duyulacak seneryolardır.

Güvenlik – Örneğin uygulamanız yüksek güvenlik izinleri ile çalışmakta fakat uygulamanızda kullanacağınız üçüncü parti bir assembly bu izinlere gerek duymamakta. Böyle bir durumda App Domain oluşturabilir ve çalışma zamanında bu üçüncü parti assembly’nin izinlerini özel olarak değiştirip sadece ihtiyaç olan izinleri verebilirsiniz.

Assembely’leri Yüklemek – Uygulamanızın bulunduğu ana App Domain içerisine büyük bir assembly yüklerseniz (load), yüklediğiniz bu assembly’i ana App Domain’inizden çıkarmaramazsınız (unload). Fakat ayrı bir App Domain oluşturup bu assembly’i bu App Domain’e yükleyebilir ve işiniz bittiğinde çıkarıp (unload) işlemlerinize devam edebilirsiniz.

Yalıtım (Isolation) – Application Domain’leri uygulamanızı birbirinden bağımsız bloklara ayırmak için kullanabilirsiniz. Basit anlamda ASP.Net’in çalışma şeklinde olduğu gibi, her web sitesini ayrı bir App Domainde host ederek herhangi bir sitede hata alındığında diğer siteler etkilenmeden çalışmasına devam eder. Bu şekilde bir kullanım bir blok çalışırken diğer blokları uygulamadan çıkarma veya değiştirme gibi bir esneklik sağlar.

Basit anlamda application domain oluşturup assembly yüklenmesine ilişkin aşamalar şekildeki gibidir.

Application Domains

Örnek bir Application Domain oluşturulup bu app domain’e assembly yükleyip metodlarını kullanalım :

static void Main(string[] args)
{
    const string thirdPartyClassPath = "ThirdPartyAssembly.UntrustedClass";
    const string thirdPartyAssemblyPath = "C:\\temp\\ThirdPartyAssembly.dll";
    var applicationBase = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

    Console.WriteLine("Application Domain ve izinleri (permissions) oluşturuluyor.");
    var ps = new PermissionSet(PermissionState.None);
    ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
    ps.AddPermission(new FileIOPermission(PermissionState.None)
    {
        AllLocalFiles = FileIOPermissionAccess.Read
    });
    ps.AddPermission(new FileIOPermission(PermissionState.None)
    {
        AllLocalFiles = FileIOPermissionAccess.PathDiscovery
    });
       
    var domain = AppDomain.CreateDomain(
                                "LowSecurityDomain",
                                null,
                                new AppDomainSetup { ApplicationBase = applicationBase },
                                ps);

    Console.WriteLine("Third Party DLL yükleniyor.");            
    var plugin = (IPlugin)domain.CreateInstanceFromAndUnwrap(thirdPartyAssemblyPath, thirdPartyClassPath);
    
    Console.WriteLine("Dosyadan okumaya çalışılıyor.");
    var canRead = plugin.ReadFile("C:\\Temp\\ReadFile.txt");
    Console.WriteLine(" {0}",canRead);
    Console.WriteLine("Dosyaya yazmaya çalışılıyor.");
    var canWrite = plugin.CreateFile("C:\\Temp\\ShouldNeverGetCreated.txt");
    Console.WriteLine(" {0}",canWrite);

    Console.WriteLine("Domain çıkarılıyor (unloading).");
    AppDomain.Unload(domain);
    Console.WriteLine("Domain çıkarıldı (unloaded).");

    Console.WriteLine("Domain çıkarıldığında ThirdParty DLL üzerindeki metodlara erişilemediği test ediliyor.");
    try
    {
        plugin.ReadFile("C:\\Temp\\ReadFile.txt");
        Console.WriteLine(" Domain çıkarıldığı (unload) için bu satır hata verecektir.");
    }
    catch
    {
        Console.WriteLine(" Domain çıkarıldığı (unload) için çıkarılan assembly metodları kullanılamaz.");
    }
    Console.ReadLine();
}

Yukarıdaki örnek çalıştırıldığında çıktısı aşağıdaki gibi olacaktır.

Application Domains

Örnek kodlarını buradan indirebilirsiniz.

Kaynak ;

Application Domains
Application Domains and Assemblies How-to Topics

0 thoughts on “C# Application Domains”

Bir cevap yazın