Arbeiten mit Anwendungsdomänen in .Net

Eine Anwendungsdomäne ist ein einfacher Prozess und fungiert als logische Grenze, die eine Isolationsgrenze für Code, Anwendungssicherheit, Zuverlässigkeit und Versionierung bietet.

Prozessgrenzen werden seit langem verwendet, um Anwendungen zu isolieren, die auf demselben System ausgeführt werden. Beachten Sie, dass ein Prozess die laufende Instanz eines Programms ist. Diese Isolation trägt dazu bei, dass sich Anwendungen im Speicher befinden und an verschiedenen Prozessgrenzen ausgeführt werden. Zwei Threads in derselben Anwendungsdomäne können also miteinander kommunizieren, zwei Threads, die zu zwei verschiedenen Anwendungsdomänen gehören, jedoch nicht.

Ein Thread ist die kleinste Ausführungseinheit innerhalb eines Prozesses. Sie können mehrere Anwendungsdomänen in einem einzelnen Prozess und mehr als einen Thread in einer Anwendungsdomäne haben. Eine Anwendungsdomäne (im Allgemeinen als AppDomains bezeichnet) ist eine logische Isolationseinheit, mit der Sie mehrere Anwendungen innerhalb desselben Prozesses ausführen und gleichzeitig sicherstellen können, dass der Absturz einer bestimmten Anwendungsdomäne die Funktion einer anderen Anwendungsdomäne nicht beeinträchtigt.

Warum brauchen wir Anwendungsdomänen?

Die Common Language Runtime-Umgebung stellt sicher, dass Code, der in einer Anwendung ausgeführt wird, nicht auf den Code oder die Ressourcen einer anderen Anwendung zugreifen kann, die im Kontext der verwalteten Umgebung ausgeführt wird. Wie wird das erreicht? Verwalteter Code oder Code, der innerhalb der verwalteten Umgebung ausgeführt wird, muss einen Überprüfungsprozess durchlaufen. Diese Überprüfung erfolgt anhand der CLR (Common Language Runtime), um die Typensicherheit zu gewährleisten. Anwendungsdomänen helfen der CLR dabei, die erforderliche Isolationsstufe bereitzustellen, sodass mehrere Anwendungen im Kontext eines einzelnen Prozesses ohne hohen Leistungsaufwand ausgeführt werden können, um die Skalierbarkeit zu erhöhen.

In der MSDN heißt es: "Anwendungsdomänen bieten eine sicherere und vielseitigere Verarbeitungseinheit, mit der die Common Language Runtime die Isolation zwischen Anwendungen gewährleisten kann. Sie können mehrere Anwendungsdomänen in einem einzigen Prozess mit derselben Isolationsstufe ausführen, die separat vorhanden wäre Prozesse, ohne jedoch den zusätzlichen Aufwand für prozessübergreifende Aufrufe oder den Wechsel zwischen Prozessen zu verursachen. "

Programmgesteuertes Erstellen von Anwendungsdomänen

Bevor wir programmgesteuert eine neue Anwendungsdomäne erstellen, wollen wir untersuchen, wie wir die Metadaten der aktuellen Anwendungsdomäne abrufen und die Assembly mit C # ausführen können. Das folgende Codeausschnitt zeigt, wie Sie die Anwendungsdomäne und die Assemblynamen der aktuell ausgeführten Assembly anzeigen können.

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

        }

    }

}

Ebenso können Sie die Metadateninformationen des Hosts und der untergeordneten Domänen mithilfe der statischen Elemente der AppDomain-Klasse abrufen.

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

        }

    }

}

Sie können eine neue Anwendungsdomäne mit einer der überladenen CreateDomain-Methoden der System.AppDomain-Klasse erstellen. Beachten Sie, dass alle diese Methoden statisch sind. Sie können sie daher aufrufen, ohne die AppDomain-Klasse instanziieren zu müssen. Hier ist die Liste der überladenen CreateDomain-Methoden der System.AppDomain-Klasse.

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)

Sie können eine Anwendungsdomäne mit einer dieser überladenen CreateDomain-Methoden erstellen. Sie können einfach den Namen der Anwendungsdomäne, die Sie als Parameter erstellen möchten, an diese Methode übergeben. Sie können die Sicherheitsrichtlinien auch als zusätzlichen Parameter übergeben, wenn Sie dies möchten. Die ExecuteAssembly-Methode wird zum Laden und Ausführen einer Assembly in einer Anwendungsdomäne verwendet.

Die folgende Codeliste zeigt, wie Sie eine neue Anwendungsdomäne erstellen und anschließend eine Assembly in der neu erstellten Anwendungsdomäne laden und ausführen können.

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

        }

    }

}

Wenn das obige Programm ausgeführt wird, wird eine neue Anwendungsdomäne mit dem Namen "AppDomain" erstellt und anschließend eine Assembly (mit dem Namen "TestCode.exe") in die Anwendungsdomäne geladen und ausgeführt. Die erstellte Anwendungsdomäne wird entladen, sobald eine Taste gedrückt wird.