FileNotFound quando si carica l’assembly con dipendenza in un altro dominio

Sto cercando di creare un’applicazione con i plugin.

Ho MainLib.dll, dove ho fatto qualche interfaccia di comando (lascia che sia ICommon ) con 1 metodo. Quindi, ho creato 2 .dll (plugin) che hanno riferimento a MainLib.dll e implementano ICommon in alcune classi. Inoltre, ho rimosso tutti i riferimenti in questo System .dlls exept.

Quindi, ho creato un’applicazione, che monitora la cartella ".\\Plugins" e carica tutti i file newDomain in newDomain , controlla se i tipi in .dll implementano ICommon (quindi questa applicazione fa anche riferimento a MainLib.dll). Se sì, aggiungi il nome di .dll in qualche elenco.

E ora ecco il problema : prima di provare a caricare i plugin, carico MailLib.dll e System a newDomain perché tutti i plugin hanno dipendenza da questo .dlls. Caricare correttamente. Quindi, inizio a caricare i plugin, e qui ho:

FileNotFoundException, Imansible caricare il file o l’assembly ‘PluginWithException, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null’ o una delle sue dipendenze. Il sistema non riesce a trovare il file specificato.) Sulla stringa Assembly loadedAssembly = domain.Load (Assembly.LoadFrom (asm) .FullName);

L’assembly PluginWithException ha solo 2 dipendenze: System e MainLib. Prima di provare a caricare PluginWithException, ho controllato gli assembly nel nuovo dominio, System e MainLib sono stati caricati su questo dominio. Quindi non riesco a vedere alcun ploblemi con dipendenza. Ho letto questo argomento e ProxyDomain la soluzione con ProxyDomain ma l’eccezione è la stessa.

Cosa sto facendo di sbagliato?

Ecco il codice:

 public static List SearchPlugins(string[] names) { AppDomain domain = AppDomain.CreateDomain("tmpDomain"); domain.Load(Assembly.LoadFrom(@".\MainLib.dll").FullName); domain.Load(@"System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); MessageBox.Show(GetAssembies(domain)); // here I can see that System and MailLib exist in new domain List plugins = new List(); foreach (string asm in names) { Assembly loadedAssembly = domain.Load(Assembly.LoadFrom(asm).FullName); // here I have exception var theClassTypes = from t in loadedAssembly.GetTypes() where t.IsClass && (t.GetInterface("ICommonInterface") != null) select t; if (theClassTypes.Count() > 0) { plugins.Add(asm); } } AppDomain.Unload(domain); return plugins; } 

non specifichi come stai configurando i percorsi di ricerca per i tuoi AppDomain in modo che possa trovare le DLL nella directory Plugin, tuttavia il tuo problema sembra essere molto simile a quello che ho risposto ieri:

AppDomain.Load () non riesce con FileNotFoundException

Forse anche questo risolverà il tuo problema? Fammi sapere come vai.

Si consiglia di indicare al dominio dove caricare i propri assembly da:

AppDomain domain = AppDomain.CreateDomain("tmpDomain", null, new AppDomainSetup { ApplicationBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins") });

Tuttavia, non vedo perché si stanno caricando assiemi nel dominio corrente (predefinito) e anche in tmpDomain.