Il modo "corretto" (MS consigliato) per eseguire questa operazione, quando è necessario utilizzare Type.GetType(string)
sui tipi negli assiemi che non si trovano nel contesto di caricamento ma nel contesto di caricamento o di assenza di contesto, è quello di eseguire il binding al Evento Appdomain.AssemblyResolve
. Il seguente codice è relativamente efficiente:
// this resolver works as long as the assembly is already loaded
// with LoadFile/LoadFrom or Load(string)/Load(byte[])
private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
var asm = (from a in AppDomain.CurrentDomain.GetAssemblies()
where a.GetName().FullName == args.Name
select a).FirstOrDefault();
if(asm == null)
throw FileNotFoundException(args.Name); // this becomes inner exc
return asm;
}
// place this somewhere in the beginning of your app:
AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
Risulta leggermente più efficiente per creare una combinazione di eventi AssemblyLoad/determinazione a mantenere il dizionario dei gruppi caricati (utilizzare l'assembly nome-chiave).
In assemblaggio.LoadFile
Ci sono alcuni seri inconvenienti nell'utilizzo di questo metodo. According to MSDN:
LoadFile non carica i file nel contesto LoadFrom, e non risolve le dipendenze che utilizzano il percorso di carico, come il metodo LoadFrom fa.
Quindi, se possibile, non utilizzare LoadFile. L'assembly risultante viene caricato nel contesto no-context, che ha ancora più svantaggi rispetto al contesto load-from. Utilizzare invece Assembly.LoadFrom e le dipendenze verranno automaticamente caricate dal percorso di caricamento.
Questo "assembly" è in qualche modo correlato al linguaggio assembly? –
@KirilKirov: No. È un tipo in .Net. –
@Austin - ah, grazie :) Sono stato fuorviato dal tag. –