【问题标题】:Loading multiple versions of the same assembly加载同一程序集的多个版本
【发布时间】:2011-05-25 23:20:30
【问题描述】:

我正在使用第三方程序集,不幸的是我现在需要将他们的最新版本和以前的版本加载到我的项目中,以便在运行时我可以决定加载哪一个。我只需要一个,而不是两个。

考虑到这一点,我还依赖于组件提供的类型,因此我无法每次都从反射加载并查询我想要使用的方法/事件/接口。我看到有人提到通过AppDomains 处理此问题,但不知道如何继续。

该过程是否会针对组件的一个版本进行编码,然后在运行时(使用AppDomain)交换我想要使用的正确 DLL?所以我只会在启动时处理这个?

【问题讨论】:

    标签: c# assemblies appdomain multiple-versions


    【解决方案1】:

    如果两个程序集兼容,您可以在 app.exe.config 或 web.config 文件中通过声明 bindingRedirect 来定义始终使用新版本。

    例子

    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v1.0.3705">
            <dependentAssembly>
                <assemblyIdentity name="Regcode" publicKeyToken="b03f5f7f11d50a3a" culture=""/>
                <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.0.3300.0"/>
            </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    

    dotnet 1.0 的这个配置条目告诉汇编加载程序始终使用版本 1.0.3300.0,无论编译到调用 exe 中的内容是什么。较新的 dotnet 版本也是如此

    【讨论】:

      【解决方案2】:

      这里有几篇关于 SO 的文章,描述了如何加载同一程序集的多个版本:

      这篇文章描述了如何引用两个不同版本的 log4net。有关他如何解决问题的更多详细信息,请参阅接受的答案下的@Joe B. 评论。

      3rd party libraries refer to different versions of log4net.dll

      那个答案是指这个链接:

      Using different versions of the same assembly in the same folder

      在此线程中,注意在同一上下文中加载同一程序集的不同版本并引用 MSDN 上的此链接:

      http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions

      这是另一个建议使用 AssemblyResolve 的答案: Reference two equal assemblies, only public keys differ

      【讨论】:

        【解决方案3】:

        如果您有同一个组件的两个不同版本,这是否意味着这两个版本不仅在实现上有所不同,而且在它们公开的操作数量上也可能不同?如果是这种情况,如果某些功能仅在两个版本之一中,您如何切换版本?

        无论如何,如果您想加载这两个版本,则必须在两个单独的应用程序域中进行,因为之后您可以卸载不需要的版本。然后您可以在正确的应用程序域中执行您的逻辑,如How do I create an application domain and run my application in it? 中所述。

        【讨论】:

          【解决方案4】:

          有一个博客条目有一个解决方案here,也可以参考这个SO线程Loading different versions of the same assembly

          【讨论】:

            猜你喜欢
            • 2010-09-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-08
            • 2011-08-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多