2010-01-16 18 views
3

Mon scénario est que j'ai une application .net (disons une application console) qui crée AppDomains. Il doit ensuite créer des instances et appeler des méthodes sur les types qui se trouvent dans ce domaine d'application. Chaque AppDomain dispose d'un répertoire spécifique où se trouvent ses dépendances, qui ne se trouve pas sous (ou même à proximité) du répertoire Applications de la console. Voici mon code simple:CreateInstance d'un type dans un autre AppDomain

string baseDirectory = "c:\foo"; // <- where AppDomain's dependecies 

// set up the app domain 
AppDomainSetup setup = new AppDomainSetup(); 
setup.ApplicationName = DateTime.Now.ToString("hh:MM:ss:ffff"); 
setup.ApplicationBase = baseDirectory; 
setup.PrivateBinPath = baseDirectory; 

// create app domain 
AppDomain domain = AppDomain.CreateDomain(
    name, 
    AppDomain.CurrentDomain.Evidence, 
    setup); 

// instantiate Type from an assembly in that AppDomain 
ObjectHandle handle = domain.CreateInstanceFrom(
    "SampleClassLibrary.dll", // <- exists in "c:\foo" 
    "SomeClassInTheDll"); 

L'appel aux résultats CreateInstanceFrom dans un FileNotFoundExcepotion. Le FusionLog montre que les répertoires qu'il a recherchés sont les répertoires des applications de la console. Il n'incluait pas les dossiers de recherche définis dans AppDomain - dans la variable "baseDirecory".

Qu'est-ce que je fais mal? Existe-t-il un autre moyen d'exécuter du code qui réside dans un autre AppDomain?

Merci ...

Répondre

3

Une solution serait de passer le chemin complet à l'appel .CreateInstanceFrom:

ObjectHandle handle = domain.CreateInstanceFrom( 
    baseDirectory + @"\SampleClassLibrary.dll", // <- exists in "c:\foo" 
    "SomeClassInTheDll"); 
+0

que fournir un chemin complet au dll a fait l'affaire, au moins je pouvais charger ce type. Il semble étrange que le AppDomain regarde dans "baseDirectory" pour cette DLL si. Je me demande s'il y aura des problèmes si cette DLL contient des références à d'autres dll qui se trouvent dans ce répertoire. Je vais tester et voir. Merci Bruce – will

+0

Tout comme je pensais, la solution ci-dessus ne fonctionne pas. C'est comme si AppDomain ne trouvait aucune de ses DLLs dépendantes puisque le répertoire qu'il regarde est la liste du répertoire des applications de la console, pas les AppDomains ... Des idées? Cela ne peut pas être si difficile? – will

+0

Imaginé que l'utilisation du gestionnaire AssemblyResolve a fait l'affaire. – will

0

Je ne peux pas dire ce qui ne va pas avec votre code, car il semble que cela devrait fonctionner. Quand je l'ai fait, cependant, j'ai fait une aide pour faire le travail. À peu près comme ceci:

public class Loader 
{ 
    public void Load(string typename) 
    { 
     // .... 
    } 
} 

Loader l = (Loader)domain.CreateInstanceAndUnwrap("Loader"); 
l.Load("SomeClassInTheDll");