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

Posted

技术标签:

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

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

【问题讨论】:

您要比较的程序集是否有其他引用?程序集是否强命名? 不,程序集没有强名称。 不,程序集没有其他引用。 【参考方案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# 独有的功能。

以上是关于.NET:加载同一个 DLL 的两个版本的主要内容,如果未能解决你的问题,请参考以下文章

使用 Side-by-Side 程序集加载 x64 或 x32 版本的 DLL

解决NopCommerce 在iis缓存目录Temporary ASP.NET Files下存在两个版本的dll问题

如何切换 .NET 程序集以执行一种方法?

System.BadImageFormatException:如何修复 .NET 版本不匹配?

是Mscoreei.dll的正确版本吗?

使用 .NET 3.5 生成的 exe 文件无法加载使用 .NET 4.5 创建的 dll?