Bonjour.

Je suis tombé sur quelques articles expliquant que pour executer des Assembly dans une SandBox (et pour pouvoir les décharger d'ailleur) il fallait créer un AppDomain.

Aujourd'hui je teste cette technique et découvre que l'assembly que je souhaite isoler est malgres tout chargée dans le AppDomain par défaut de mon appli :

Voici un bout de code qui semble le démontrer, car l'assembly Plugin.dll est dans le sous repertoire "plugins" de mon appli :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
public static void Load()
{
   //Je crée l'AppDomain pour isoler mon plugin
   AppDomainSetup setup = new AppDomainSetup();
   setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
 
//Important :Ici je dis que l'AppDomain que je vais créer, pourra
// chercher des assembly dans le sous repertoire "plugins"
   setup.PrivateBinPath = "plugins"; 
 
   AppDomain domaine = AppDomain.CreateDomain(
      "Domaine Plugins",
       null,
       setup);
 
  domaine.UnhandledException += 
     new UnhandledExceptionEventHandler(domaine_UnhandledException);
 
//Je fais un ptit test pour la demo
   if (!File.Exists("./plugins/plugin.dll"))
                {
                    Console.WriteLine("Plugin absent");
                    return;
                }
   try
   {
       IPlugin plugin = (IPlugin)domaine.CreateInstanceFromAndUnwrap("plugin.dll", "Plugin.Plugin");
      Console.WriteLine("appelle son Run");
      plugin.Run();
   }
   catch(Exception err)
   {
        Console.WriteLine("Exception dans l'AppDomain par defaut:\r\n{0}",err.ToString());
   }
}
 
 static void domaine_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
           Console.WriteLine("La SandBox a levé une exception innatendue :(\r\n{1}", e.ExceptionObject.ToString());
        }
Voila le code ci dessus m'affiche (je l'ai résumée hein )
:
Exception dans l'AppDomain par defaut:
FileNotFoundException ... le fichier ...\MonProj\bin\Debug\plugin.dll est introuvable
Donc je suis assez surpris, je m'attendais éventuellement à voir "La SandBox a levé une exception"

Sauriez vous me dire svp : comment faire pour que mon Domaine par defaut ne cherche pas à charger cette assembly?

Mieux encore, m'expliquer pourquoi ça fait ça?