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

时间:2010-10-31 22:51:13

标签: .net

我使用VS2010构建一个程序集,它有一个简单的vanilla引用.NET 4.0。

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

当我用ildasm查看清单时,我看到两个版本的.NET作为我的程序集的直接依赖项,再加上在Ionic程序集下再次列出的2.0。

这是正常的,还是有一些2.0依赖,我只是没有看到?

1 个答案:

答案 0 :(得分:3)

这是正常的,您将看到由旧程序集中的公共类型公开的任何框架类的.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程序集进行测试的代码。我还没有听说过一个案例。