2010-10-24 12 views
7

tengo programa que carga un conjunto usando Asssembly.LoadFrom método. Algún tiempo después, intento utilizar Type.GetType para crear un tipo a partir de ese ensamblado (usando AssemblyQualifiedName), pero el método devuelve null. Si lo configuro para lanzar una excepción, diceType.GetType no puede crear tipo de montaje ya cargado

No se pudo cargar el archivo o ensamblado '...' o una de sus dependencias. El sistema no puede encontrar el archivo especificado.

Pero estoy seguro de que el mismo conjunto ya está cargado (se muestra en la lista AppDomain.CurrentDomain.GetAssemblies()).

Alguien tiene una idea de lo que podría estar equivocado y/o la forma de resolver este problema?

+0

El método que c reates el tipo se llama desde el código ubicado en ese ensamblaje. AFAIK, el ensamblado no puede ejecutar ningún código a menos que esté correctamente cargado. –

Respuesta

10

Con el fin de entender por qué esto no funciona, es necesario entender el tema de la "carga" contextos. Type.GetType solo mira el contexto "Cargar". El ensamblaje que cargó en la memoria estaba en el contexto "LoadFrom".

La única manera de conseguir realmente se une en el contexto de carga para ver asambleas en la carga de contexto es usar el evento AssemblyResolve y escribir código para devolver el correcto montaje. El evento AssemblyResolve se desencadena justo antes de que el enlace falle y todas las demás búsquedas de ensamblaje no se realizaron correctamente.

Consulte los siguientes enlaces para obtener más información acerca de los contextos de carga y los problemas que surgen al utilizar LoadFrom.

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

+1

A intentó usar Assembly.Load (AssemblyName.GetAssemblyName (file)). El ensamblaje se carga bien (el resto del programa parece funcionar), pero la excepción en Type.GetType se mantiene igual. –

+2

Ahora funciona (después de que agregué el directorio donde están los ensamblados en app.config). Gracias por la explicación de la zona de .NET de la que no tenía ni idea. –

+0

A la derecha, AssemblyName devuelto por GetAssemblyName le proporcionará el nombre correcto del ensamblado, pero cuando se pase a Assembly.Load, se seguirán las reglas normales de prueba de ensamblaje. Como ha notado, solo funciona si el tiempo de ejecución puede encontrar el ensamblado, lo que puede implicar sugerencias de prueba de app.config. – Josh

6

Si usted puede conseguir el conjunto con Assembly.LoadFrom entonces se puede obtener el tipo haciendo:

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

El ensamblaje .GetType tiene otras sobrecargas que se puede encontrar información sobre here

+2

+1 Buena solución pragmática. Todavía puede tener problemas si otro código intenta cargar otros tipos en el mismo ensamblado a través del contexto de carga sin AssemblyResolve. Desafortunadamente, LoadFrom tiene un montón de efectos secundarios inesperados que son difíciles de solucionar. – Josh

Cuestiones relacionadas