Resolver referencias de ensamblado desde otra carpeta

Estoy desarrollando una aplicación que hace referencia y utiliza algunas asambleas de terceros de un determinado proveedor; en el cuadro de desarrollo tengo estos 3 ensamblajes en una carpeta de referencia en mi árbol de fonts y puedo hacer referencia a ellos y crear la aplicación, las comstackciones de aplicaciones pero no se ejecutan porque la aplicación de servidor completa no está instalada, pero esto está bien.

En el servidor donde quiero copiar esta aplicación personalizada y ejecutar todos los ensamblajes a los que me refiero están en una carpeta algo así como:

D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64 

y si copio mi pequeño ejecutable en esa carpeta y lo ejecuto, funciona perfectamente, pero si pongo mi .exe en una carpeta más apropiada como la que quiero:

 D:\ProgramFiles\MyCompanyName\MyProduct\bin\... 

no funciona porque no puede resolver esos ensamblajes.

Sé que puedo usar el sondeo en app.config para especificar en qué carpetas mi exe tiene que buscar referencias, pero en mi caso los ensamblajes no están en una subcarpeta, más en una ubicación completamente diferente.

No quiero copiar todos los ensamblados de proveedores en la carpeta de mi aplicación y no puedo colocar solo los 3 a los que me refiero porque también están cargando otros ensamblajes y, a menos que los tenga todos (muchos …), no funciona. trabajo.

No estoy haciendo nada especial, no creando dominios de aplicaciones y no cargando ensambles por reflexión, solo quiero que el CLR resuelva las referencias según sean necesarias en el inicio o la ejecución de la aplicación.

Gracias.

Editar: aquí el código de trabajo final

 static System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { Logger logger = new Logger(); try { string RMSAssemblyFolder = ConfigurationManager.AppSettings["RMSAssemblyFolder"]; Assembly MyAssembly = null; string strTempAssmbPath = string.Empty; Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly(); AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies(); AssemblyName myAssemblyName = Array.Find(arrReferencedAssmbNames, a => a.Name == args.Name); if (myAssemblyName != null) { MyAssembly = Assembly.LoadFrom(myAssemblyName.CodeBase); } else { strTempAssmbPath = Path.Combine(RMSAssemblyFolder, args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll"); if (!string.IsNullOrEmpty(strTempAssmbPath)) { if (File.Exists(strTempAssmbPath)) { logger.Information("Assembly to load: {0} - File was found in: {1}", args.Name, strTempAssmbPath); // Loads the assembly from the specified path. MyAssembly = Assembly.LoadFrom(strTempAssmbPath); } } } // Returns the loaded assembly. return MyAssembly; } catch (Exception exc) { logger.Error(exc); return null; } } 

Primero debe encontrar la carpeta donde están instalados estos archivos DLL, luego use AppDomain.AssemblyResolve para enganchar la resolución del ensamblado e intente cargar los ensamblados solicitados desde esta carpeta.

Se verá algo así (no probado, y debe verificar qué contiene exactamente args.Name , podría contener la versión y el nombre fuerte junto con el nombre del tipo):

 var otherCompanyDlls = new DirectoryInfo(companyFolder).GetFiles("*.dll"); AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var dll = otherCompanyDlls.FirstOrDefault(fi => fi.Name == args.Name); if (dll == null) { return null; } return Assembly.Load(dll.FullName); }; 

Use SN.exe : SN -T VendorAssembly.dll, esto devolverá un número hexadecimal que es el token de clave pública, luego, haga referencia al ensamblado desde app.config. Para obtener la versión, haga clic con el botón derecho en el ensamblado de su proveedor y utilícela para el valor de la versión codeBase, href = ruta que mencionó.