我使用VS2010构建一个程序集,它有一个简单的vanilla引用.NET 4.0。
它还引用了Ionic.Zip,它引用了.NET 2.0。
当我用ildasm查看清单时,我看到两个版本的.NET作为我的程序集的直接依赖项,再加上在Ionic程序集下再次列出的2.0。
这是正常的,还是有一些2.0依赖,我只是没有看到?
答案 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程序集进行测试的代码。我还没有听说过一个案例。