在运行时加载2个版本组件的(Loading 2 versions of assembly at ru

2019-06-26 22:45发布

我一直在试图破解这一个过去的几个星期,还没有找到一个很好的解决方案之中; 希望我能在这里得到答案。

我有两个组件(ZA和ZB),两者都指向一个共同的项目/ DLL(ZC),但这些都可能是在不同的版本(即相同的DLL名称,相同的命名空间,某些类可能会有所不同)。 每个组件的工作方式本身,但是,如果是由其他在运行时加载(如A负荷B),然后我无法得到它的工作。 需要一些帮助。

这里的设置:

  • ZA取决于ZC(通用)1.1版本
  • ZB取决于ZC 1.0版本

ZA需要加载需要加载ZB东西(这取决于ZC),在运行时。

ZA是主应用程序。 根据其bin目录中,有一个插件目录plugins/plugin-ZB下,我想将所有ZB和它的依赖(ZC)的。

以下是我试过到目前为止:

Assembly.Load()使用DLL的相同版本-工作得很好。

Assembly.Load()使用不同版本的dll - ZB负荷,但该方法运行时,我得到未发现异常的方法。

AppDomain.Load()得到了一个文件未找到错误; 我甚至用委托来解决组件。

关于ZC一些细节: - 一些方法是公共静态(有些则不是)。 例如Log.Log("hello"); - 一些可能返回的值(基元或对象)。 - 一些方法都是非静态的(和返回值)。

救命? - TIA

Answer 1:

    m_Assembly1 = Reflection.Assembly.LoadFile(IO.Path.Combine(System.Environment.CurrentDirectory, "Old Version\Some.dll"))
    m_Assembly2 = Reflection.Assembly.LoadFile(IO.Path.Combine(System.Environment.CurrentDirectory, "New Version\Some.dll"))

    Console.WriteLine("Old Version: " & m_Assembly1.GetName.Version.ToString)
    Console.WriteLine("New Version: " & m_Assembly2.GetName.Version.ToString)

    m_OldObject = m_Assembly1.CreateInstance("FullClassName")
    m_NewObject = m_Assembly2.CreateInstance("FullClassName")

从现在开始我用后期绑定和/或反射来运行我的测试。

.NET:加载版本二同一个DLL的



Answer 2:

除了乔纳森·艾伦出色的建议,更“经典”的方式来解决这个问题是通过加载2个版本在2个不同AppDomanis。 然后,您可以使用.NET远程处理,使这两个应用程序域comunicate。 因此,ZA应该创建一个新的AppDomain,负载在这个AppDomain中ZB,并通过Remoting援引ZB一些操作。

需要注意的是.NET远程对您要使用(从MarshalByRef继承)类的一些要求,并创建一个AppDomain是昂贵的操作。

希望这有助于



Answer 3:

我曾在同一时间加载同一程序集的两个版本。 它发生与就像你描述它的场景。

你必须说服运行时加载ZC相同版本的两个ZA和ZB。 我发现两种方法来做到这一点:

  1. 使用bindingRedirect在App.config文件中的元素。 还有在一些细节这个问题 。
  2. 使用AppDomain.AssemblyResolve事件。 还有在一些细节这个答案 。

与唯一的问题AppDomain.AssemblyResolve是,它只有当触发运行时无法找到所需的版本。 如果两个版本可供选择,那么你就必须使用bindingRedirect 。 我已经使用了AppDomain.AssemblyResolve事件,然后添加一个安全检查确保正确的版本是通过大会的引用的程序集装看。 如果不是,我抱怨到旧版本的库是躺在附近的用户,告诉他们在哪里。



文章来源: Loading 2 versions of assembly at runtime
标签: c# appdomain