2011-09-11 10 views
5

Estoy tratando de localizar un tipo en tiempo de ejecución de una lista de ensamblajes; mi código es algo como esto:¿Por qué no funcionarían Type.GetType() y Assembly.GetType()?

foreach (Assembly assembly in assembliesToSearch) 
{ 
    Type t = assembly.GetType(assemblyName); 
    if (t != null) 
    { 
     return t; 
    } 
} 

, y el problema que tengo es que t siempre viene como nulo. Jugando con el depurador y la ventana intermedia en VS2010, me di cuenta lo siguiente cuando pongo un punto de interrupción dentro del bucle:

Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

funciona bien, pero

assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

no (cuando el conjunto es el ensamblador que sé que contiene la clase que estoy buscando - en el depurador, puedo poner un reloj en el ensamblado. GetTypes(), navegue a la clase que estoy tratando de crear una instancia, y llame a assembly.GetType ("MyNamespace.MyClass , MyNamespace ")).

¿Alguien sabe por qué funciona la búsqueda de todos los ensamblados que utilizan Type.GetType(), pero la búsqueda en el ensamblado que conozco contiene el tipo que usa assembly.GetType() no?

Respuesta

9

A partir de los documentos de MSDN para los dos métodos, Type.GetType() espera un nombre conjunto calificado de un tipo mientras que Assembly.GetType() espera que el nombre completo del tipo. Estos no son la misma cosa.

typeof(MyNamespace.MyClass).AssemblyQualifiedName resultado un nombre de ensamblaje calificado de un tipo (algo así como MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral), por lo que no funciona con el Assembly.GetType() llamada que está esperando una cadena en el formato MyNamespace.MyClass.

Esto es probablemente debido al hecho de que cuando pasa el nombre calificado para ensamblaje a la llamada Assembly.GetType(), está buscando un tipo en el conjunto cuyo nombre completo coincida con el que ha proporcionado. No puede encontrar uno, por lo que obtiene un null devuelto. Este no es el caso con la llamada Type.GetType(), ya que espera obtener un nombre calificado de ensamblador de un tipo y puede ubicar tanto el ensamblaje como el tipo.


Algo a tener en cuenta:

Si está "tratando de localizar un tipo en tiempo de ejecución de una lista de conjuntos" como usted dice, usted es probablemente mejor usar la llamada Assembly.GetType() de cada conjunto en el enumera y pasa el nombre completo del tipo. Type.GetType() probablemente usará las referencias del ensamblado actual para resolver el tipo, de modo que si el tipo existe en un ensamblaje que no es una referencia, no se encontrará.

+0

Gracias por la respuesta; mi ejemplo de código inicial no lo muestra claramente, pero dentro de mi bucle, donde llamo Type t = assembly.GetType (assemblyName), assemblyName es "MyNamespace.MyClass, MyAssembly", por lo que, según mis cálculos, debería estar volviendo. el tipo esperado. –

+0

@David: 'MyNamespace.MyClass, MyAssembly' sigue siendo un nombre de tipo calificado para ensamblaje. Debe quitar el nombre del ensamblado de esa cadena para que funcione con 'Assembly.GetType()'. – adrianbanks

+0

@adrianbanks: dónde aprendiste "Type.GetType() probablemente usará las referencias del ensamblado actual para resolver el tipo" - no parece estar en [MSDN aquí] (http: // msdn) .microsoft.com/es-us/library/w3f99sx1 (v = vs.110) .aspx). Además, ¿qué es el "ensamblaje actual"? En el caso que estoy viendo ahora, el ensamblado con el tipo - ¡que se encuentra! - no es el ensamblado con el método ejecutado actualmente y no es una referencia de él ... pero es un ensamblado en la pila de llamadas.(El motivo de mi pregunta: La versión en mi nombre de conjunto es incorrecta pero se encuentra el tipo.) – davidbak

Cuestiones relacionadas