/ / GetExportedTypes () FileNotFoundException: no se pudo encontrar el ensamblado - c #, filenotfoundexception

GetExportedTypes () FileNotFoundException: no se pudo encontrar el ensamblado - c #, filenotfoundexception

Mi tarea: Encuentre todos los formularios (WindowsForm o WPF, no importa) en un archivo dll o exe y devuelva esa lista. En teoría, eso funciona (es decir, si tengo un ensamblaje con un WPF o WindowsForm, mi código se las arregla para obtener todos los formularios, TextBoxes, etiquetas etc.). Cuando se trata de ensamblajes "reales" falla. Obtengo excepciones de FileNotFound cuando llamo a GetExportedTypes () por cada ensamblado "personalizado" (se encuentran ensamblados .NET, no hay problemas). Ya uso GetReferencedAssemblies () para cargar los ensamblados referenciados (Reflection.Assembly.LoadFrom) y sí funciona (todos los ensamblajes se encuentran y se cargan en el dominio de aplicación) pero no ayuda.

Verifiqué los números de versión (coinciden), copié mi ejecutable y el ensamblaje en un directorio con todos los ensamblajes a los que se hace referencia, no funciona.

Aquí está mi código, tal vez alguien se da cuenta de lo que estoy haciendo (obviamente) mal:

foreach (AssemblyName reference in selectedAssembly.GetReferencedAssemblies())
{
if (System.IO.File.Exists(
System.IO.Path.GetDirectoryName(selectedAssembly.Location) +
@"" + reference.Name + ".dll"))
{
System.Reflection.Assembly.LoadFrom(
System.IO.Path.GetDirectoryName(selectedAssembly.Location) +
@"" + reference.Name + ".dll");
}
else if (System.IO.File.Exists(@"C:dll" + reference.Name + ".dll"))
{
System.Reflection.Assembly.LoadFrom(@"C:dll" + reference.Name + ".dll");
}
else
{
System.Reflection.Assembly.ReflectionOnlyLoad(reference.FullName);
}

selectedAssembly.GetExportedTypes();
}

en primer lugar, compruebe si la dll referenciada existe enel directorio donde se encuentra el ensamblado, si no, verifique si existe en C: dll y si no está allí, intente usar el GAC. Funciona y no tengo errores desde allí, pero tan pronto como llegue a GetExportedTypes falla con una excepción FileNotFound en la primera biblioteca personalizada.

* edición 1 ¿Qué quiero decir con "ensamblados reales"? Quiero decir ensamblados que son más complejos y tienen referencias a bibliotecas / ensamblajes no estándar de .NET


Gracias por la sugerencia de fuslogvw.exe Hans Passant, pero ¿qué quiere decir con "con código como este"?


bien utilicé fuslogvw.Exe y yo obtenemos dos excepciones por cada dll individual a la que hace referencia el "selectedAssembly". El primero dice algo como "El enlace comienza en el contexto LoadFrom La imagen que posee el sistema no se busca en LoadFrom-Context

la otra logeria dice que la dll referenciadapor el conjunto seleccionado no se pudo encontrar e intentó descargarlo desde la ruta base de la aplicación y todos los directorios a continuación ... pero no desde su ubicación real ... así que, pregunta clave: ¿cómo puedo cambiar la carga? ¿Contexto a LoadFrom? ¿Y por qué .NET es tan terco en esto? Me refiero a que los ensamblados están cargados en el dominio de aplicación, no debería preocuparse por la ubicación real del ensamblaje.


bien problema resuelto Aquí está la solución: http://ayende.com/blog/1376/solving-the-assembly-load-context-problem

Lo implementé en mi clase existente (eliminé la palabra clave estática y puse el cuerpo del método Init en mi método), lo compilé y funcionó.

gracias por su ayuda chicos.

Respuestas

4 para la respuesta № 1

bien problema resuelto Aquí está la solución: http://ayende.com/blog/1376/solving-the-assembly-load-context-problem

Lo implementé en mi clase existente (eliminé la palabra clave estática y puse el cuerpo del método Init en mi método), lo compilé y funcionó.

gracias por su ayuda chicos.

En caso de que algún día el sitio web no esté disponible, aquí está el código fuente de Ayende.

static Dictionary<string, Assembly>assemblies;

public static void Init()
{

assemblies = new Dictionary<string, Assembly>();

AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(CurrentDomain_AssemblyLoad);

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{

Assembly assembly = null;

assemblies.TryGetValue(args.Name, out assembly);

return assembly;

}

static void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args)
{

Assembly assembly = args.LoadedAssembly;
assemblies[assembly.FullName] = assembly;
}

2 para la respuesta № 2

Yo recomendaría usar Reflector para ver cualReferencias que puede no haber cargado. Por ejemplo, solo está cargando los ensamblajes a los que hace referencia el ensamblaje actual. ¿Pasas a través de cada niño para encontrar sus asambleas referenciadas también? El error FileNotFound probablemente le está apuntando en la dirección de un tipo que se declara en otro conjunto que no está cargado.