2010-10-24 18 views
7

Ho un programma che carica un assieme utilizzando il metodo Asssembly.LoadFrom. Qualche tempo dopo cerco di utilizzare Type.GetType per creare un tipo da tale assembly (utilizzando AssemblyQualifiedName), ma il metodo restituisce null. Se impostato per generare un'eccezione, indicaType.GetType non riesce a creare il tipo dal gruppo già caricato

Impossibile caricare il file o l'assembly '...' o una delle sue dipendenze. Il sistema non riesce a trovare il file specificato.

Ma sono sicuro che lo stesso assemblaggio è già caricato (viene visualizzato nell'elenco AppDomain.CurrentDomain.GetAssemblies()).

Qualcuno ha un'idea di cosa potrebbe essere sbagliato e/o come risolvere questo problema?

+0

Il metodo che c il tipo viene chiamato dal codice situato in quell'assembly. AFAIK, l'assembly non può eseguire alcun codice a meno che non sia stato caricato correttamente. –

risposta

10

Per capire perché questo non funziona, è necessario comprendere il problema dei "contesti di caricamento". Type.GetType guarda solo al contesto "Load". L'assembly caricato in memoria era nel contesto "LoadFrom".

L'unico modo per ottenere collegamenti nel contesto di caricamento per visualizzare gli assembly nel contesto di caricamento è utilizzare l'evento AssemblyResolve e scrivere il codice per restituire l'assembly corretto. L'evento AssemblyResolve si attiva immediatamente prima del bind e tutte le altre ricerche dell'assembly non hanno avuto esito positivo.

Vedere i collegamenti seguenti per ulteriori informazioni sui contesti di carico e sui problemi che si presentano quando si utilizza LoadFrom.

MSDN - http://msdn.microsoft.com/en-us/library/dd153782.aspx
AssemblyResolve - http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx
Suzanne Cook - http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57143.aspx

+1

A provato usando Assembly.Load (AssemblyName.GetAssemblyName (file)). L'assembly carica bene (il resto del programma sembra funzionare), ma l'eccezione nel Type.GetType rimane la stessa. –

+2

Ora funziona (dopo aver aggiunto la directory in cui gli assembly sono in app.config). Grazie per la spiegazione di questa area di .NET di cui non avevo idea. –

+0

A destra, AssemblyName restituito da GetAssemblyName ottiene il nome sicuro dell'assembly, ma quando viene passato a Assembly.Load, vengono seguite le normali regole di verifica dell'assemblaggio. Quindi, come hai notato, funziona solo se il runtime può trovare l'assembly che potrebbe coinvolgere gli hint di verifica app.config. – Josh

6

Se è possibile ottenere l'assembly utilizzando Assembly.LoadFrom allora si può ottenere il tipo da fare:

 Assembly assembly = Assembly.LoadFrom("whatever"); 
     Type myType = assembly.GetType("typeName") 

L'assemblaggio .GetType ha altri sovraccarichi che puoi trovare su here

+2

+1 Buona soluzione pragmatica. Può ancora incorrere in problemi se altri codici tentano di caricare altri tipi nello stesso assembly tramite il contesto di caricamento senza AssemblyResolve. Sfortunatamente, LoadFrom ha solo un po 'di effetti collaterali inaspettati che sono difficili da risolvere. – Josh

Problemi correlati