come aggiornare la sezione assemblyBinding nel file di configurazione in fase di runtime?

Sto cercando di cambiare l’associazione dell’assieme (da una versione all’altra) in modo dinamico.

Ho provato questo codice ma non funziona:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConfigurationSection assemblyBindingSection = config.Sections["assemblyBinding"]; assemblyBindingSection.SectionInformation.ConfigSource = "bindingConf.xml"; config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("assemblyBinding"); 

con bindingConf.xml contenente la configurazione della sezione assemblyBinding.

Quindi può cambiare questa sezione in fase di runtime? come farlo? Quali alternative ho?

Il modo migliore che ho trovato per associare dynamicmente a una versione diversa di un assembly consiste AppDomain.AssemblyResolve evento AppDomain.AssemblyResolve . Questo evento viene generato ogni volta che il runtime non è in grado di individuare l’assembly esatto a cui è stata collegata l’applicazione e consente di fornire un altro assembly, che si carica autonomamente, al suo posto (purché sia ​​compatibile).

Ad esempio, puoi inserire un costruttore statico nella class principale dell’applicazione che aggancia l’evento in questo modo:

 using System.Reflection; static Program() { AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e) { AssemblyName requestedName = new AssemblyName(e.Name); if (requestedName.Name == "AssemblyNameToRedirect") { // Put code here to load whatever version of the assembly you actually have return Assembly.LoadFrom("RedirectedAssembly.DLL"); } else { return null; } }; } 

Questo metodo evita la necessità di gestire i collegamenti degli assembly nei file di configurazione ed è un po ‘più flessibile in termini di cosa si può fare con esso.

RuntimeSection dell’aggiornamento del file di configurazione in fase di esecuzione utilizzando questo codice:

 private void ModifyRuntimeAppConfig() { XmlDocument modifiedRuntimeSection = GetResource("Framework35Rebinding"); if(modifiedRuntimeSection != null) { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConfigurationSection assemblyBindingSection = config.Sections["runtime"]; assemblyBindingSection.SectionInformation.SetRawXml(modifiedRuntimeSection.InnerXml); config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("runtime"); } } 

con Framework35Rebinding contenente:

             

e un app.config contenente (prima dell’esecuzione del programma):

 < ?xml version="1.0"?>        

Tuttavia non funziona per quello che voglio fare perché assemblyBinding viene letto solo all’avvio dell’applicazione mentre RefreshSection("runtime")