c# - Establecer la ruta personalizada a las DLL referenciadas?
reference delay-load (3)
Aquí hay otra forma de proceder sin utilizar AppendPrivatePath
obsoleto . Captura un tipo de evento " dll asociado no encontrado " (por lo que se llamará solo si el archivo DLL no se encuentra en el directorio predeterminado).
Funciona para mí (.NET 3.5, no probado otras versiones)
/// <summary>
/// Here is the list of authorized assemblies (DLL files)
/// You HAVE TO specify each of them and call InitializeAssembly()
/// </summary>
private static string[] LOAD_ASSEMBLIES = { "FooBar.dll", "BarFooFoz.dll" };
/// <summary>
/// Call this method at the beginning of the program
/// </summary>
public static void initializeAssembly()
{
AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs args)
{
string assemblyFile = (args.Name.Contains('',''))
? args.Name.Substring(0, args.Name.IndexOf('',''))
: args.Name;
assemblyFile += ".dll";
// Forbid non handled dll''s
if (!LOAD_ASSEMBLIES.Contains(assemblyFile))
{
return null;
}
string absoluteFolder = new FileInfo((new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).LocalPath).Directory.FullName;
string targetPath = Path.Combine(absoluteFolder, assemblyFile);
try
{
return Assembly.LoadFile(targetPath);
}
catch (Exception)
{
return null;
}
};
}
PD: No logré usar AppDomainSetup.PrivateBinPath
, es demasiado laborioso.
Tengo un proyecto de C # (llámalo MainProj
) que hace referencia a varios otros proyectos de DLL. Al agregar estos proyectos a las referencias de MainProj
, los compilará y copiará sus DLL resultantes al directorio de trabajo de MainProj.
Lo que me gustaría hacer es hacer que estas DLL referenciadas se MainProj
en un subdirectorio del directorio de MainProj
de MainProj
, es decir, MainProj / bin / DLL, en lugar del directorio de trabajo en sí.
No soy un programador de C # con mucha experiencia, pero provengo del mundo de C ++, supongo que un enfoque sería eliminar las referencias del proyecto y cargar explícitamente las DLL requeridas por ruta y nombre de archivo (es decir, en C ++, LoadLibrary
). Sin embargo, lo que preferiría hacer, si hay una manera, sería establecer algún tipo de "ruta binaria de referencia", para que todos sean copiados automáticamente en este subdirectorio cuando construya (y luego se haga referencia desde allí sin yo necesito cargar explícitamente cada uno). ¿Es posible tal cosa?
Si no, ¿cuál es el método preferido en C # para lograr lo que busco (es decir, algo con Assembly.Load
/ Assembly.LoadFile
/ Assembly.LoadFrom
? Algo en AppDomain
quizás, o System.Environment
?)
De Tomek responda a: Cargando dlls desde la ruta especificada en SetdllDirectory en c #
var dllDirectory = @"C:/some/path";
Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + ";" + dllDirectory)
¡Funciona perfectamente para mí!
Desde esta página (no probado por mí):
En algún lugar de la inicialización de su programa (antes de acceder a cualquier clase desde un ensamblado al que se hace referencia) haga esto:
AppDomain.CurrentDomain.AppendPrivatePath(@"bin/DLLs");
Editar: Este artículo dice que AppendPrivatePath se considera obsoleto, pero también ofrece una solución alternativa.
Editar 2: Parece que la manera más fácil y más kosher de hacerlo es en el archivo app.config (ver here ):
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin/DLLs" />
</assemblyBinding>
</runtime>
</configuration>