如何在运行时更新配置文件中的assemblyBinding部分?

我正在尝试动态更改程序集绑定(从一个版本到另一个版本)。

我试过这段代码,但它不起作用:

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

with bindingConf.xml包含assemblyBinding部分配置。

那么可以在运行时更改此部分吗? 怎么做? 我有什么替代品?

我发现动态绑定到程序集的不同版本的最好方法是挂钩AppDomain.AssemblyResolve事件。 只要运行时无法找到应用程序链接的确切程序集,就会触发此事件,并且它允许您在其位置提供另一个自己加载的程序集(只要它是兼容的)。

例如,您可以在应用程序的主类上放置一个静态构造函数来挂钩事件,如下所示:

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

此方法避免了处理配置文件中的程序集绑定的需要,并且就您可以使用它执行的操作而言更灵活一些。

使用以下代码在运行时更新配置文件的RuntimeSection:

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

Framework35Rebinding包含:

             

和一个app.config包含(在执行程序之前):

         

然而,它不适用于我想做的事情,因为assemblyBinding仅在应用程序启动时读取,而RefreshSection("runtime")