Arbeta med applikationsdomäner i .Net

En applikationsdomän är en lätt process och fungerar som en logisk gräns som ger en isoleringsgräns för kod, applikationssäkerhet, tillförlitlighet och versionering.

Processgränser har använts under lång tid för att isolera applikationer som körs i samma system. Observera att en process är den körande instansen av ett program. Denna isolering hjälper till att applikationer finns i minnet och körs i olika processgränser. Så två trådar i samma applikationsdomän kan kommunicera med varandra, men två trådar som tillhör två olika applikationsdomäner kan inte.

En tråd är den minsta exekveringsenheten i en process. Du kan ha flera applikationsdomäner som finns i en enda process och mer än en tråd i en applikationsdomän. En applikationsdomän (vanligtvis kallad AppDomains) är en logisk isoleringsenhet som gör att du kan köra flera applikationer inom samma process samtidigt som du säkerställer att krasch av en viss applikationsdomän inte påverkar funktionen för en annan applikationsdomän.

Varför behöver vi applikationsdomäner?

Den gemensamma språket runtime-miljö säkerställer att kod som körs i en applikation inte kan komma åt koden eller resurserna för en annan applikation som körs inom ramen för den hanterade miljön. Hur uppnås detta? Hanterad kod eller kod som körs i den hanterade miljön måste gå igenom en verifieringsprocess. Denna verifiering görs CLR (common language runtime) för att säkerställa typsäkerhet. Applikationsdomäner hjälper CLR att tillhandahålla den nödvändiga isoleringsnivån så att flera applikationer kan köras inom ramen för en enda process utan mycket prestandakostnader för att öka skalbarheten.

MSDN säger: "Applikationsdomäner ger en säkrare och mångsidigare bearbetningsenhet som den gemensamma språket körtid kan använda för att ge isolering mellan applikationer. Du kan köra flera applikationsdomäner i en enda process med samma isoleringsnivå som skulle finnas i separata processer, men utan att ådra sig ytterligare omkostnader för att göra samtalsprocesser eller växla mellan processer. "

Skapa applikationsdomäner programmatiskt

Innan vi skapar en ny applikationsdomän programmatiskt, låt oss undersöka hur vi kan hämta metadata för den aktuella applikationsdomänen och utföra montering med C #. Följande kodavsnitt illustrerar hur du kan visa applikationsdomänen och monteringsnamnen på den nuvarande körande enheten.

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();

        }

    }

}

På samma sätt kan du hämta metadatainformationen för värden och barndomänerna med hjälp av de statiska medlemmarna i AppDomain-klassen.

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();         

        }

    }

}

Du kan skapa en ny applikationsdomän med hjälp av en av de överbelastade CreateDomain-metoderna i System.AppDomain-klassen. Observera att alla dessa metoder är statiska, så du kan åberopa dem utan behov av att starta klassen AppDomain. Här är listan över de överbelastade CreateDomain-metoderna i System.AppDomain-klassen.

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)

Du kan skapa en applikationsdomän med någon av dessa överbelastade CreateDomain-metoder - du kan bara skicka namnet på applikationsdomänen som du vill skapa som en parameter till denna metod. Du kan också skicka säkerhetspolicyn om du vill göra det som en ytterligare parameter. Metoden ExecuteAssembly används för att ladda och köra en sammansättning i en applikationsdomän.

Följande kodlista visar hur du kan skapa en ny applikationsdomän och sedan ladda och köra en enhet i den nyskapade applikationsdomänen.

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);

        }

    }

}

När ovanstående program körs kommer en ny applikationsdomän med namnet "AppDomain" att skapas och sedan laddas en enhet (med namnet "TestCode.exe") in i applikationsdomänen och körs. Applikationsdomänen som har skapats kommer att laddas ned när en knapp trycks in.