6

在过去的几周里,我一直在尝试破解这个问题,但还没有找到好的解决方案;希望我能在这里得到答案。

我有两个程序集(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

4

3 回答 3

3
    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 的两个版本

于 2010-03-03T00:06:45.937 回答
1

Apart from Jonathan Allen excellent advice, a more "classical" way to resolve the problem is by loading the 2 versions in 2 different AppDomanis. You can then use .NET Remoting to make the two AppDomains comunicate. So ZA should create a new Appdomain, Load in this AppDomain ZB and invoke some operation in ZB via Remoting.

Note that .NET Remoting has some requirements on the classes that you want to use (inheritance from MarshalByRef), and creating an AppDomain is an expensive operation.

Hope this help

于 2009-07-27T17:24:20.270 回答
0

我同时加载了同一个程序集的两个版本。正如您所描述的那样,它发生在一个场景中。

您必须说服运行时为 ZA 和 ZB 加载相同版本的 ZC。我找到了两种方法来做到这一点:

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

唯一的问题AppDomain.AssemblyResolve是它仅在运行时找不到请求的版本时触发。如果两个版本都可用,那么您将不得不使用bindingRedirect. 我使用了该AppDomain.AssemblyResolve事件,然后添加了一个安全检查,以确保通过查看程序集的引用程序集集合来加载正确的版本。如果不是,我会向用户抱怨该库的旧版本在周围,并告诉他们它在哪里。

于 2010-03-02T23:48:51.610 回答