Estoy desarrollando una aplicación que hace referencia y usa ensamblajes de terceros de un determinado Proveedor; en el cuadro de desarrollo tengo estos 3 ensamblajes en una carpeta de referencia en mi árbol de fuentes y puedo hacer referencia a ellos y crear la aplicación, las compilaciones de aplicaciones pero no se ejecutan porque la aplicación de servidor completa no está instalada, pero esto está bien.Resolver referencias de ensamblados desde otra carpeta
En el servidor donde quiero copiar esta aplicación personalizada y ejecutar todos los conjuntos que estoy referenciación están en carpeta algo como:
D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64
y si copio mi pequeño ejecutable en esa carpeta y ejecutarlo, se funciona perfectamente, pero si pongo mi .exe en una carpeta más apropiado como yo quiero:
D:\ProgramFiles\MyCompanyName\MyProduct\bin\...
no funciona porque no puede resolver esas asambleas.
Sé que puedo usar sondeos en app.config para especificar en qué carpetas mi exe tiene que buscar referencias, pero imy caso los conjuntos 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 poner 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.
No estoy haciendo nada especial, no creando dominios de aplicaciones y no cargando ensambles por reflexión, solo quiero que 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<AssemblyName>(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;
}
}
posible duplicado de http://stackoverflow.com/questions/1373100/how-to-add-folder-to-assembly-search-path-at-runtime-in-net – nawfal