Bekerja dengan domain aplikasi di .Net

Domain aplikasi adalah proses yang ringan dan bertindak sebagai batas logis yang memberikan batas isolasi untuk kode, keamanan aplikasi, keandalan, dan pembuatan versi.

Batasan proses telah digunakan sejak lama untuk mengisolasi aplikasi yang dijalankan dalam sistem yang sama. Perhatikan bahwa proses adalah contoh program yang sedang berjalan. Isolasi ini membantu agar aplikasi berada di memori dan dijalankan dalam batas proses yang berbeda. Jadi, dua utas dalam domain aplikasi yang sama dapat berkomunikasi satu sama lain, tetapi dua utas yang dimiliki oleh dua domain aplikasi berbeda tidak dapat.

Utas adalah unit eksekusi terkecil dalam suatu proses. Anda dapat memiliki beberapa domain aplikasi yang berada di dalam satu proses dan lebih dari satu utas di dalam domain aplikasi. Sebuah domain aplikasi (biasa disebut AppDomains) adalah unit logis dari isolasi yang memungkinkan Anda untuk mengeksekusi beberapa aplikasi dalam proses yang sama sementara pada saat yang sama memastikan bahwa crash dari domain aplikasi tertentu tidak mempengaruhi fungsi domain aplikasi lain.

Mengapa kita membutuhkan domain aplikasi?

Lingkungan runtime bahasa umum memastikan bahwa kode yang berjalan di dalam satu aplikasi tidak dapat mengakses kode atau sumber daya aplikasi lain yang berjalan dalam konteks lingkungan yang dikelola. Bagaimana ini tercapai? Kode atau kode terkelola yang dijalankan di dalam lingkungan terkelola harus melewati proses verifikasi. Verifikasi ini dilakukan CLR (runtime bahasa umum) untuk memastikan keamanan tipe. Domain aplikasi membantu CLR untuk menyediakan tingkat isolasi yang diperlukan sehingga beberapa aplikasi dapat dijalankan dalam konteks satu proses tanpa banyak overhead kinerja untuk meningkatkan skalabilitas.

MSDN menyatakan: "Domain aplikasi menyediakan unit pemrosesan yang lebih aman dan serbaguna yang dapat digunakan oleh runtime bahasa umum untuk menyediakan isolasi antar aplikasi. Anda dapat menjalankan beberapa domain aplikasi dalam satu proses dengan tingkat isolasi yang sama yang akan ada di terpisah proses, tetapi tanpa menimbulkan biaya tambahan untuk membuat panggilan lintas-proses atau beralih antar proses. "

Membuat domain aplikasi secara terprogram

Sebelum kita membuat domain aplikasi baru secara terprogram, mari kita telusuri bagaimana kita dapat mengambil metadata dari domain aplikasi saat ini dan menjalankan perakitan menggunakan C #. Potongan kode berikut mengilustrasikan bagaimana Anda dapat menampilkan domain aplikasi dan nama assembly dari perakitan yang sedang dijalankan.

using System;

using System.Threading;

using System.Reflection;

namespace ApplicationDomains

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine(Thread.GetDomain().FriendlyName);

            Console.WriteLine(Assembly.GetEntryAssembly().FullName);

            Console.ReadLine();

        }

    }

}

Demikian pula, Anda dapat mengambil informasi metadata dari host dan domain anak menggunakan anggota statis kelas AppDomain.

using System;

namespace ApplicationDomains

{

    class Program

    {

        static void Main(string[] args)

        {

            AppDomain childApplicationDomain = AppDomain.CreateDomain("ApplicationDomain");

            Console.WriteLine("The host domain name is:  " + AppDomain.CurrentDomain.FriendlyName);

            Console.WriteLine("The host domain id is:  " + AppDomain.CurrentDomain.Id.ToString());

            Console.WriteLine("The child domain name is:  " + childApplicationDomain.FriendlyName);

            Console.WriteLine("The child domain id is:  " + childApplicationDomain.Id.ToString());

            Console.ReadKey();         

        }

    }

}

Anda dapat membuat domain aplikasi baru menggunakan salah satu metode CreateDomain yang kelebihan beban dari kelas System.AppDomain. Perhatikan bahwa semua metode ini statis sehingga Anda dapat memanggilnya tanpa perlu membuat instance kelas AppDomain. Berikut daftar metode CreateDomain yang kelebihan beban dari kelas System.AppDomain.

public static AppDomain CreateDomain(String appDomainName)

public static AppDomain CreateDomain(String appDomainName, Evidence securityInformation)

public static AppDomain CreateDomain(String appDomainName,

   Evidence securityInformation, AppDomainSetup appDomainSetupInformation)

public static AppDomain CreateDomain(String name,

   Evidence securityInformation, String appBasePath, String appRelativeSearchPath,

   bool shadowCopyFiles)

Anda dapat membuat domain aplikasi menggunakan salah satu metode CreateDomain yang kelebihan beban ini - Anda cukup meneruskan nama domain aplikasi yang ingin Anda buat sebagai parameter untuk metode ini. Anda juga dapat meneruskan kebijakan keamanan jika Anda ingin sebagai parameter tambahan. Metode ExecuteAssembly digunakan untuk memuat dan melaksanakan perakitan dalam domain aplikasi.

Daftar kode berikut menunjukkan bagaimana Anda dapat membuat domain aplikasi baru dan kemudian memuat dan melaksanakan perakitan di dalam domain aplikasi yang baru dibuat.

using System;

namespace ApplicationDomains

{

    class Program

    {

        static void Main(string[] args)

        {

            AppDomain applicationDomain = System.AppDomain.CreateDomain("AppDomain");

            applicationDomain.ExecuteAssembly(@"D:\Projects\TestCode.exe");

 Console.WriteLine("Press any key to unload the application domain...");

            Console.ReadKey();

            System.AppDomain.Unload(applicationDomain);

        }

    }

}

Ketika program di atas dijalankan, domain aplikasi baru bernama "AppDomain" akan dibuat dan kemudian sebuah assembly (bernama "TestCode.exe") dimuat ke dalam domain aplikasi dan dijalankan. Domain aplikasi yang telah dibuat akan diturunkan setelah tombol ditekan.