【问题标题】:.NET: Load two version of the same DLL.NET:加载同一个 DLL 的两个版本
【发布时间】:2010-01-06 22:57:25
【问题描述】:

我需要加载同一个 DLL 的两个版本来比较它们的输出。我假设我可以为此使用 AppDomains,但我需要一些指导。

【问题讨论】:

  • 您要比较的程序集是否有其他引用?程序集是否强命名?
  • 不,程序集没有强名称。
  • 不,程序集没有其他引用。

标签: .net appdomain


【解决方案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")

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

【讨论】:

    【解决方案2】:

    查看 MSDN 上的 Activator.CreateInstance()。内的代码示例。

    http://msdn.microsoft.com/en-us/library/ms224132.aspx

    【讨论】:

      【解决方案3】:

      Here 是这样做的指南:

      extern alias oldVer;
      extern alias newVer;
      

      当你编译时:

      csc /r:oldVer=Somepath\ClassLibrary.dll /r:newVer=AnotherPath\ClassLibrary.dll program.cs
      

      或在 Visual Studio 中更改项目引用的属性选项卡中的“别名”字段

      【讨论】:

      • 如果 ClassLibrary.dll 引用另一个程序集,我们会遇到这种方法的一些问题,clr 只会解析第一个版本的依赖项,第二个版本的依赖项被解析为第一个版本。我们不得不订阅 AppDomain.ResolveAssembly 并做一些讨厌的事情来解决这个问题。
      • 我的测试工具已经用 VB 编写,所以当然这必须是 C# 独有的功能。
      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多