首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行时更新配置文件中的assemblyBinding部分?

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

Stack Overflow用户
提问于 2008-11-28 13:35:39
回答 3查看 11.5K关注 0票数 12

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

我试过这个代码,但它不能工作:

代码语言:javascript
复制
      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节配置。

那么,A可以在运行时更改此部分吗?该怎么做呢?我还有其他选择吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-11-28 15:19:32

我发现动态绑定到不同版本的程序集的最佳方法是挂接AppDomain.AssemblyResolve事件。每当运行库无法找到应用程序所链接到的确切程序集时,就会激发此事件,并且此事件允许您提供另一个您自己加载的程序集来代替它(只要它是兼容的)。

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

代码语言:javascript
复制
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;
        }
    };
}

这种方法避免了在配置文件中处理程序集绑定的需要,并且在您可以使用它做什么方面更加灵活。

票数 22
EN

Stack Overflow用户

发布于 2008-12-01 08:33:20

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

代码语言:javascript
复制
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包含:

代码语言:javascript
复制
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
      <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/>
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.CompactFramework.Build.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
      <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="9.0.0.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

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

代码语言:javascript
复制
<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
  <runtime>
  </runtime>
</configuration>

然而,它不能实现我想要做的事情,因为assemblyBinding只在应用程序启动时被读取,而RefreshSection("runtime")

票数 3
EN

Stack Overflow用户

发布于 2019-03-20 00:48:13

我喜欢Eric的回答。这是一个救命稻草,当尝试使用新的NuGet PackageReference模型与网络应用程序。问题是您可以让msbuild自动生成绑定,但是,它们会生成到Assembly.dll.config而不是web.config的绑定。所以这个变通方法很棒。

我修改了埃里克的代码,使其更通用,并与ASP.Net核心应用程序一起使用:

代码语言:javascript
复制
AppDomain.CurrentDomain.AssemblyResolve += delegate (object sender2, ResolveEventArgs e2)
            {
                var requestedNameAssembly = new AssemblyName(e2.Name);
                var requestedName = requestedNameAssembly.Name;
                if (requestedName.EndsWith(".resources")) return null;
                var binFolder = System.Web.Hosting.HostingEnvironment.MapPath("~/bin");
                var fullPath = Path.Combine(binFolder, requestedName) + ".dll";
                if (File.Exists(fullPath))
                {
                    return Assembly.LoadFrom(fullPath);
                }

                return null;
            };
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/325788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档