Utilisation de domaines d'application dans .Net

Un domaine d'application est un processus léger et agit comme une limite logique qui fournit une limite d'isolation pour le code, la sécurité des applications, la fiabilité et la gestion des versions.

Les limites de processus sont utilisées depuis longtemps pour isoler les applications qui s'exécutent dans le même système. Notez qu'un processus est l'instance en cours d'exécution d'un programme. Cet isolement permet aux applications de résider dans la mémoire et de s'exécuter dans différentes limites de processus. Ainsi, deux threads dans le même domaine d'application peuvent communiquer entre eux, mais deux threads appartenant à deux domaines d'application différents ne le peuvent pas.

Un thread est la plus petite unité d'exécution d'un processus. Vous pouvez avoir plusieurs domaines d'application résidant dans un même processus et plusieurs threads dans un domaine d'application. Un domaine d'application (communément appelé AppDomains) est une unité logique d'isolation qui vous permet d'exécuter plusieurs applications au sein du même processus tout en garantissant que le plantage d'un domaine d'application particulier n'affecte pas le fonctionnement d'un autre domaine d'application.

Pourquoi avons-nous besoin de domaines d'application?

L'environnement d'exécution en langage commun garantit que le code exécuté dans une application ne peut pas accéder au code ou aux ressources d'une autre application exécutée dans le contexte de l'environnement géré. Comment cela est-il accompli? Le code géré ou le code qui s'exécute à l'intérieur de l'environnement géré doit passer par un processus de vérification. Cette vérification est effectuée le CLR (Common Language Runtime) pour assurer la sécurité du type. Les domaines d'application aident le CLR à fournir le niveau d'isolation requis afin que plusieurs applications puissent s'exécuter dans le contexte d'un seul processus sans trop de surcharge de performances pour augmenter l'évolutivité.

Le MSDN déclare: "Les domaines d'application fournissent une unité de traitement plus sécurisée et polyvalente que le Common Language Runtime peut utiliser pour assurer l'isolation entre les applications. Vous pouvez exécuter plusieurs domaines d'application dans un même processus avec le même niveau d'isolation qui existerait dans des processus, mais sans encourir la surcharge supplémentaire de passer des appels inter-processus ou de basculer entre les processus. "

Création de domaines d'application par programmation

Avant de créer un nouveau domaine d'application par programme, explorons comment nous pouvons récupérer les métadonnées du domaine d'application actuel et exécuter l'assembly à l'aide de C #. L'extrait de code suivant montre comment afficher le domaine d'application et les noms d'assembly de l'assembly en cours d'exécution.

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

        }

    }

}

De même, vous pouvez récupérer les informations de métadonnées de l'hôte et des domaines enfants à l'aide des membres statiques de la classe 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();         

        }

    }

}

Vous pouvez créer un nouveau domaine d'application à l'aide de l'une des méthodes CreateDomain surchargées de la classe System.AppDomain. Notez que toutes ces méthodes sont statiques, vous pouvez donc les appeler sans avoir besoin d'instancier la classe AppDomain. Voici la liste des méthodes CreateDomain surchargées de la classe 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)

Vous pouvez créer un domaine d'application à l'aide de l'une de ces méthodes CreateDomain surchargées - vous pouvez simplement transmettre le nom du domaine d'application que vous souhaitez créer en tant que paramètre à cette méthode. Vous pouvez également transmettre les politiques de sécurité si vous le souhaitez en tant que paramètre supplémentaire. La méthode ExecuteAssembly est utilisée pour charger et exécuter un assembly dans un domaine d'application.

La liste de codes suivante montre comment créer un nouveau domaine d'application, puis charger et exécuter un assembly dans le domaine d'application nouvellement créé.

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

        }

    }

}

Lorsque le programme ci-dessus est exécuté, un nouveau domaine d'application nommé "AppDomain" sera créé, puis un assembly (nommé "TestCode.exe") chargé dans le domaine d'application et exécuté. Le domaine d'application qui a été créé sera déchargé une fois qu'une touche est enfoncée.