2010-11-16 14 views
10

¿Cómo obtengo las rutas de acceso de todos los ensamblados a los que hace referencia el ensamblaje que se está ejecutando actualmente? GetReferencedAssmblies() me da el AssemblyName[] s. ¿Cómo llego desde donde están cargados?Obtener las rutas de acceso de todos los ensamblados a los que se hace referencia

+4

probar este http://stackoverflow.com/questions/1582510/ get-pathes-of-assemblies-used-in-type –

+0

Muchas gracias. Eso lo resolvió para mí. –

+0

Para obtener un ejemplo completo de cómo obtener todos los ensamblados a los que se hace referencia, de forma recursiva, consulte http://stackoverflow.com/questions/383686/how-do-you-loop-through-currently-loaded-assemblies/26300241#26300241. – Contango

Respuesta

12

No se puede saber hasta que se carga el ensamblado. El algoritmo de resolución de ensamblaje es complicado y no se puede adivinar de antemano lo que hará. Llamar a la anulación Assembly.Load(AssemblyName) le dará una referencia al ensamblaje, y su propiedad Location le dice lo que necesita.

Sin embargo, realmente no quiere cargar ensamblados por adelantado, antes de el compilador JIT lo hace. Es ineficiente y la probabilidad de problemas no es cero. Por ejemplo, podría iniciar un evento AppDomain.AssemblyResolve antes de que el programa esté listo para responderlo. Evita hacer esta pregunta.

+0

Muchas gracias por la respuesta correcta. –

0

La propiedad CodeBase debe proporcionar el nombre completo de la ruta.

+0

¿Lo has probado? –

+5

Desafortunadamente, CodeBase devuelve nulo en cada ensamblado al que se hace referencia. :-) –

0

Usted puede obtener la ubicación URL del conjunto de la siguiente manera:

Assembly.GetExecutingAssembly().GetReferencedAssemblies()[0].CodeBase 
+1

CodeBase devuelve nulo. La solución está en la publicación a la que se vinculó JasonEvans en su comentario a la publicación original. Además, Hans Passant también tiene la respuesta correcta. –

2

Siguiendo la respuesta de Hans Passant, y dado que la propiedad CodeBase siempre contenía null, se me ocurrió esto. Es posible que no encuentre todos los ensamblajes, ya que es posible que no estén todos cargados. En mi situación, tuve que encontrar todas las referencias de un montaje cargado previamente, por lo que funcionó bien:

IEnumerable<string> GetAssemblyFiles(Assembly assembly) 
{ 
    var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
    foreach (var assemblyName in assembly.GetReferencedAssemblies()) 
     yield return loadedAssemblies.SingleOrDefault(a => a.FullName == assemblyName.FullName)?.Location; 
} 

Uso:

var assemblyFiles = GetAssemblyFiles(typeof(MyClass).Assembly); 
Cuestiones relacionadas