我正在尝试动态更改程序集绑定(从一个版本到另一个版本).
我试过这段代码,但它不起作用:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConfigurationSection assemblyBindingSection = config.Sections["assemblyBinding"]; assemblyBindingSection.SectionInformation.ConfigSource = "bindingConf.xml"; config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("assemblyBinding");
与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; } }; }
此方法避免了处理配置文件中的程序集绑定的需要,并且就您可以使用它执行的操作而言更灵活一些.