.net 程序集清单中是否提升了依赖项?

2024-04-06

我使用 VS2010 构建了一个程序集,它具有对 .NET 4.0 的普通引用。

它还引用了 Ionic.Zip,后者引用了 .NET 2.0。

当我使用 ildasm 查看清单时,我发现 .NET 的两个版本都是我的程序集的直接依赖项,并且在 Ionic 程序集下再次列出了 2.0。

这是正常现象,还是存在一些我没有看到的 2.0 依赖性?


这是正常的,您将看到旧程序集中的公共类型公开的任何框架类的 .NET 2.0 程序集引用。例如在VS2008中编译的一个类库项目,代码如下:

using System;
using System.Text;

public class Class1 {
    public static void Run(out StringBuilder sb) {
        sb = new StringBuilder();
    }
}

并在面向 4.0 的 VS2010 控制台模式应用程序中使用:

using System;
using System.Text;

class Program {
    static void Main(string[] args) {
        StringBuilder sb;
        Class1.Run(out sb);
    }
}

在其清单中生成程序集引用,如下所示:

// Metadata version: v4.0.30319
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly extern ClassLibrary3
{
  .ver 1:0:0:0
}
.assembly extern mscorlib as mscorlib_2
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}

请注意对 mscorlib 2.0 版本的引用,名为“mscorlib_2”。这是在运行时解决的。融合日志中没有任何迹象表明曾要求解析 mscorlib_2 程序集引用。创建的 StringBuilder 类对象是 4.0 版本。这可能意味着 CLR 程序集加载器正在重定向版本。我不知道有任何配置进行映射,猜测这是硬编码的。

对于仅使用 v2.0-v3.5sp1 版本的 .NET 程序集进行测试的代码来说,这当然可能会破坏行为。我还没有听说过一个案例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net 程序集清单中是否提升了依赖项? 的相关文章

随机推荐