2012-04-27 16 views
10

Tengo una aplicación C#, y para organizar sus archivos tengo algunas DLL en una carpeta llamada "Datos". Quiero que el EXE compruebe esta carpeta para el DLL al igual que comprueba su directorio actual. Si creé una App.Config con esta información:C# Establecer sonda privatePath sin app.config?

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="Data" /> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

Funciona sin problemas. No quiero tener una App.Config. ¿Hay alguna forma de configurar la ruta de exploración sin usar app.config?

Respuesta

4

Puede hacerlo para los nuevos AppDomains que cree, no creo que exista una forma de hacerlo en el código administrado para AppDomain actual/predeterminado.

Editar: Creación de dominio de aplicación con camino privado: utilizar AppDomain.CreateDomain y AppDomainSetup .PrivateBinPath

+0

1. De ninguna manera, eso debe establecerse cuando se crea el AppDomain. app.config se evalúa por el inicio del programa desde el tiempo de ejecución. La única alternativa está en el código, creando un segundo dominio de aplicación. ESO, aunque puede ser un enfoque adecuado. – TomTom

+0

¿Y cómo haría eso? –

+0

Actualizó la respuesta con enlaces. –

0

setup.ApplicationBase = DataDir; тоже самое, что и privatePath = "Datos"

[STAThread] 
    static void Main() 
    { 
     #region Add Dll Folder 

     System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(MainForm)); 
     string dataDir = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(new Uri(assembly.GetName().CodeBase).LocalPath), "Data"); 

     AppDomainSetup setup = new AppDomainSetup(); 
     setup.ApplicationBase = dataDir; 

     #endregion Add Dll Folder 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 
3

Ésta es una cuestión de edad, pero también se puede manejar el dominio de aplicación AssemblyResolve evento de este modo:

`` `

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

` ``

y:

`` `

private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var probingPath = pathToYourDataFolderHere; 
     var assyName = new AssemblyName(args.Name); 

     var newPath = Path.Combine(probingPath, assyName.Name); 
     if (!newPath.EndsWith(".dll")) 
     { 
      newPath = newPath + ".dll"; 
     } 
     if (File.Exists(newPath)) 
     { 
      var assy = Assembly.LoadFile(newPath); 
      return assy; 
     } 
     return null; 
    } 

`` `