2012-04-03 56 views
5

Estoy ejecutando una aplicación WCF CoreApplication cuyo proyecto VS tiene una referencia a AncillaryProject. CoreApplication utiliza una clase Provider de AncillaryProject; sin embargo, nunca se hace referencia explícita: se invoca a través de Reflection.Asamblea referenciada no encontrada - Cómo obtener todas las DLL incluidas en la solución

Mi problema es que a veces CoreApplication no encuentra Provider porque AncillaryProject no aparece en la llamada a GetAssemblies(). A veces funciona bien, pero a veces (supongo que puede ser después de un JIT) falla.

Aquí está mi código original:

var providers = from d in AppDomain.CurrentDomain.GetAssemblies() 
       from c in d.GetTypes() 
       where typeof(BaseProvider).IsAssignableFrom(c) 
       select c; 

Después de mirar this question, He intentado utilizar GetReferencedAssemblies():

var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) 
{ 
    allAssemblies = allAssemblies.Union(
          a.GetReferencedAssemblies() 
          .Select(b => System.Reflection.Assembly.Load(b))); 
} 
var providers = from d in allAssemblies 
       from c in d.GetTypes() 
       where typeof(BaseProvider).IsAssignableFrom(c) 
       select c; 

que se dan cuenta de que la cuestión hice referencia resuelve el problema a través de la carga de forma dinámica todos los archivos DLL en el directorio bin, pero eso no me parece particularmente bueno. ¿Hay una manera mejor de hacer esto, o simplemente .NET no carga los otros ensamblajes en absoluto? ¿Cómo funciona esto bajo el capó, y hay algo que pueda hacer al respecto?

+1

No va a responder por completo a su pregunta, pero hay algo de información relevante en mi respuesta a esta pregunta: http://stackoverflow.com/questions/9947882/ get-assemblies-without-instaying-them/9948404 # comment12730056_9948404 Aparte de observar que los ensamblados "referenciados" en VisualStudio no significan mucho en el tiempo de ejecución, la respuesta a continuación sobre el uso de Fusion Logger también es una buena ayuda. Debería poder simplemente copiar AncillaryProject.dll dondequiera que Fusion esté buscando ensamblajes, pero podría proporcionar algunas respuestas sobre dónde está buscando. – CodingWithSpike

+0

Ahh - eso me da exactamente la información que necesito saber. – eouw0o83hf

+0

Seguimiento para cualquiera que encuentre esta pregunta: en los años transcurridos desde que lo pregunté, me di cuenta de que estaba haciendo esto de una manera completamente incorrecta. A veces, ser menos mágico y enumerar explícitamente el 'Tipo' que desea es mucho, mucho mejor. Esta es una de esas situaciones. – eouw0o83hf

Respuesta

9

Según la documentación de Microsoft AppDomain.CurrentDomain.GetAssemblies() obtiene los conjuntos que se han cargado en el contexto de ejecución de este dominio de aplicación. About AppDomain.CurrentDomain.GetAssemblies()

Parece que debe cambiar la estrategia de carga de los ensamblajes que necesita desde el dominio de aplicación a buscar dlls en su carpeta de aplicaciones.

me encontré con una discusión sobre un problema similar here

+0

Sí, eso lo describe perfectamente. Gracias. – eouw0o83hf

3

Debe descargar el SDK de .NET Desarrollo y puesta en marcha FuslogVw.exe (visor de registro de fusión). Informará sobre la aplicación CLR que intenta resolver dependencias .NET. Le mostrará si estaba buscando y cómo evalúa a los candidatos ubicados en esos lugares.

Cuestiones relacionadas