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?
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
Ahh - eso me da exactamente la información que necesito saber. – eouw0o83hf
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