2012-04-27 18 views
10

Ho un'applicazione C# e per organizzare i suoi file ho alcune DLL in una cartella chiamata "Dati". Voglio che l'EXE controlli questa cartella per le DLL proprio come controlla la sua directory corrente. Se ho creato un App.Config con queste informazioni:C# Imposta l'interrogazione privatePath senza 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> 

Funziona senza problemi. Non voglio avere un App.Config. C'è un modo per impostare il percorso di sondaggio senza usare app.config?

risposta

4

È possibile farlo per nuovi AppDomain creati, non credo che ci sia un modo per farlo nel codice gestito per AppDomain corrente/predefinito.

Edit: La creazione di AppDomain con il percorso privato: utilizzare AppDomain.CreateDomain e AppDomainSetup .PrivateBinPath

+0

+1. Assolutamente no: deve essere impostato quando viene creato AppDomain. app.config viene valutato dall'avvio del programma dal runtime. L'unica alternativa è nel codice, creando un secondo appdomain. Questo però può essere un approccio accettabile. – TomTom

+0

E come lo farei? –

+0

Aggiornata la risposta con i collegamenti. –

0

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

[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

Questa è una vecchia questione, ma si può anche gestire il dominio di applicazione AssemblyResolve evento in questo modo:

`` `

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

` ``

e:

`` `

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; 
    } 

`` `