2010-02-11 11 views
26

Por alguna razón, parece que no puedo obtener la lista de tipos en un conjunto al que se hace referencia. No solo eso, ni siquiera puedo llegar a este conjunto referenciado.¿Cómo obtener todos los tipos en un conjunto al que se hace referencia?

Intenté AppDomain.CurrentDomain.GetAssemblies(), pero solo devuelve ensamblajes que ya han sido cargados en la memoria.

Intenté Assembly.GetExecutingAssembly().GetReferencedAssemblies(), pero esto simplemente devuelve mscorlib.

¿Qué me estoy perdiendo?

+1

¿Está tratando de inspeccionar un ensamblaje al que hace referencia el proyecto, o uno sentado en el sistema de archivos en alguna parte? – Amy

+1

Sospecho que la implementación de CLR haría imposible obtener todos los tipos de todos los ensamblajes porque tendrían que compilarse justo a tiempo en un momento inoportuno, pero realmente no soy un experto en eso, por lo que solo debería hacerlo utiliza mi comentario como una pista para una mayor exploración. – zneak

+0

@yodaj007 Montaje referenciado – AngryHacker

Respuesta

52

Tenga en cuenta que Assembly.GetReferencedAssemblies solo incluye un ensamblaje particular si realmente usa un tipo en ese ensamblaje en su ensamblaje (o un tipo que use depende de un tipo en ese ensamblaje). No es suficiente simplemente incluir un ensamblado en la lista de referencias en Visual Studio. Tal vez esto explica la diferencia en el rendimiento de lo que esperabas? Noto que si espera poder obtener todas las asambleas que están en la lista de referencias en Visual Studio usando la reflexión que es imposible; los metadatos para el ensamblaje no incluyen información sobre ensamblajes de los que no depende el ensamblaje determinado.

Dicho esto, una vez que haya recuperado una lista de todos los ensamblados de referencia algo como lo siguiente debe dejar enumerar sobre todos los tipos de esas asambleas:

foreach (var assemblyName in Assembly.GetExecutingAssembly().GetReferencedAssemblies()) { 
    Assembly assembly = Assembly.Load(assemblyName); 
    foreach (var type in assembly.GetTypes()) { 
     Console.WriteLine(type.Name); 
    } 
} 

Si necesita las asambleas que se hace referencia en Visual Studio, entonces tendrá que analizar el archivo csproj. Para eso, consulte el elemento ItemGroup que contiene Reference elementos.

Finalmente, si usted sabe dónde vive un ensamblaje, puede cargarlo usando Assembly.LoadFile y luego, básicamente, proceda como se indicó anteriormente para enumerar los tipos que viven en ese ensamblaje cargado.

+1

Eso es básicamente la esencia del problema. Mi aplicación debe inspeccionar primero el ensamblaje al que se hace referencia antes de usar los tipos que contiene. Entonces no, no se usa hasta después de haber sido inspeccionado. – AngryHacker

+0

@AngryHacker: De acuerdo, creo que entiendo lo que estás diciendo. Por favor mira mi edición. Avísame si esa aclaración ayuda. – jason

Cuestiones relacionadas