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 ...
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
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
Imaginé que l'utilisation du gestionnaire AssemblyResolve a fait l'affaire. – will