Mis archivos DLL son cargados por una aplicación de terceros, que no podemos personalizar. Mis ensamblajes deben ubicarse en su propia carpeta. No puedo ponerlos en GAC (mi aplicación tiene un requisito para implementarse usando XCOPY). Cuando la DLL raíz intenta cargar recursos o tipos desde otra DLL (en la misma carpeta), la carga falla (FileNotFound). ¿Es posible agregar la carpeta donde se encuentran mis archivos DLL a la ruta de búsqueda de ensamblado mediante programación (desde el archivo DLL raíz)? No tengo permiso para cambiar los archivos de configuración de la aplicación.
.net
search
assemblies
path
isobretatel
fuente
fuente
if (!File.Exists(asmPath)) return searchInGAC(...);
Puede agregar una ruta de prueba al archivo .config de su aplicación, pero solo funcionará si la ruta de prueba está contenida dentro del directorio base de su aplicación.
fuente
AssemblyResolve
solución muchas veces, es bueno tener otra opción (y más fácil).Actualización para Framework 4
Dado que Framework 4 plantea el evento AssemblyResolve también para recursos, este manejador funciona mejor. Se basa en el concepto de que las localizaciones están en subdirectorios de la aplicación (uno para la localización con el nombre de la cultura, es decir, C: \ MyApp \ it para el italiano) En el interior hay un archivo de recursos. El controlador también funciona si la localización es país-región, es decir, it-IT o pt-BR. En este caso, el controlador "podría llamarse varias veces: una vez para cada cultura en la cadena de respaldo" [de MSDN]. Esto significa que si devolvemos un valor nulo para el archivo de recursos "it-IT", el marco genera el evento pidiendo "it".
Gancho de evento
Controlador de eventos
fuente
AssemblyName
constructor para decodificar el nombre del ensamblado en lugar de confiar en analizar la cadena del ensamblado.La mejor explicación de la propia MS :
fuente
AssemblyResolve
es para CurrentDomain, no válido para otro dominioAppDomain.CreateDomain
Para usuarios de C ++ / CLI, aquí está la respuesta de @Mattias S (que funciona para mí):
fuente
He usado la solución @Mattias S '. Si realmente desea resolver dependencias de la misma carpeta, debe intentar usar la ubicación del ensamblaje Solicitante , como se muestra a continuación. args.RequestingAssembly debe verificarse por nulidad.
fuente
busque en AppDomain.AppendPrivatePath (en desuso) o AppDomainSetup.PrivateBinPath
fuente
AppDomain.AppendPrivatePath
La documentación parece sugerir que debería soportar expandir dinámicamente laAppDomain
ruta de búsqueda de la página, solo que la característica está en desuso. Si funciona, es una solución mucho más limpia que la sobrecargaAssemblyResolve
.AppDomain.AppendPrivatePath
que no hace nada en .NET Core y se actualiza.PrivateBinPath
en el marco completo .Vine aquí desde otra pregunta (marcada como duplicado) acerca de agregar la etiqueta de prueba al archivo App.Config.
Quiero agregar una nota al margen de esto: Visual Studio ya había generado un archivo App.config, sin embargo, ¡agregar la etiqueta de prueba a la etiqueta de tiempo de ejecución pregenerada no funcionó! necesita una etiqueta de tiempo de ejecución separada con la etiqueta de prueba incluida. En resumen, su App.Config debería verse así:
Esto tomó un tiempo para darse cuenta, así que lo estoy publicando aquí. También se acredita a The PrettyBin NuGet Package . Es un paquete que mueve los dlls automáticamente. Me gustó un enfoque más manual, así que no lo usé.
Además, aquí hay un script de compilación posterior que copia todo .dll / .xml / .pdb a / Lib. Esto despeja la carpeta / debug (o / release), lo que creo que la gente intenta lograr.
fuente