2012-04-23 45 views
13

Tengo el siguiente método que se debe recuperar una lista de ensamblados cargados locales (en la carpeta bin):No todos los conjuntos están siendo cargados en dominio de aplicación de la carpeta bin

static IEnumerable<Assembly> GetLocalAssemblies() 
    { 
     Assembly callingAssembly = Assembly.GetCallingAssembly(); 
     string path = new Uri(Path.GetDirectoryName(callingAssembly.CodeBase)).AbsolutePath; 

     var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
     return assemblies.Where(x => !x.IsDynamic && new Uri(x.CodeBase).AbsolutePath.Contains(path)).ToList(); 
    } 

embargo, la lista de conjuntos de falta un par de asambleas que necesito que tenga. Los ensamblajes que necesito son administrados (C# .net 4), están referenciados en el proyecto y están presentes en la carpeta bin.

¿Por qué son binarios que están presentes en la carpeta bin NO barrido en el dominio de aplicación cuando se inicia la aplicación?

+0

por curiosidad, ¿cuál es el valor de la ruta de la cadena? –

+0

Es la ruta a la carpeta bin para el proyecto. –

Respuesta

24

Adil tiene, pero con más detalle:

El CLR .NET utiliza la compilación Just-In-Time. Entre otras cosas, esto significa que carga ensamblajes en el primer uso. Así, a pesar de conjuntos que se están referenciados por un montaje en uso, si las referencias no han sido todavía necesita el CLR para ejecutar el programa, no están cargadas y por tanto no aparecerán en la lista de ensamblados en el dominio de aplicación actual.

Otra cosa que puede aplicarse o no, es que si tiene la misma versión del ensamblaje en el GAC, el CLR usa el GAC preferentemente sobre ensamblados locales, A MENOS que la ruta a esos ensamblados se especifique en el entorno DEVPATH variable. Si este es el caso y el CLR está utilizando la copia GAC ​​de cualquiera de los ensamblados "faltantes", tendrán diferentes valores de CodeBase y no aparecerán en los resultados de su consulta de Linq.

Otra cosa: es posible que desee considerar el uso de la propiedad Location lugar de la propiedad CodeBase. La propiedad Location contiene la ruta absoluta al ensamblado que se cargó en el tiempo de ejecución. La propiedad CodeBase es ligeramente diferente, y puede no ser la misma para todos los ensamblados en una compilación completa de un proyecto.

+0

+1 para la propiedad de ubicación. – Turbot

+1

+1 "si las referencias no han sido necesarias por el CLR, no aparecerán en la lista de ensamblados en el actual dominio de aplicación" <--- Ugh. Este fue el problema raíz de un error que me ha estado matando. – jwatts1980

4

Los CurrentDomain.GetAssemblies() sólo volver ensamblados cargados no todos los montajes que están disponibles en la carpeta de ejecución.

Esto es lo que dicen que Microsoft about it "GetAssemblies método para obtener una lista de todos los conjuntos que se han cargado en el dominio de aplicación." click here

3

Intente iniciar cualquier clase en estos ensamblados faltantes y luego vuelva a ejecutar el código .. Los ensamblajes se cargan cuando es necesario solo con la primera llamada a cualquier cosa relacionada con ese ensamblaje.

Cuestiones relacionadas