如何鉴别程序集是否已经编译为/使用了.NET 4.5,而不是.NET 4.0?

6
我有一些构建代理,通过TeamCity设置为我们构建.NET代码,但我开始怀疑尽管项目设置,它们是否输出了.NET 4.5编译的程序集。我之所以对此存疑,是因为我不知道Windows Server 2012原装是否带有.NET 4.5或4.0,因此是否仅具有4.0或任何4.0程序集。
我如何查看磁盘上的程序集并确定它是使用.NET 4.0还是4.5构建的?
正如Marc Gravell在这篇博客文章中明确表明的那样,这些程序集的构建方式存在差异,即使我们可能并没有特别使用.NET 4.5程序集/功能。
我尝试在程序集上使用ILDASM,但已知的.NET 4.5(.1)控制台应用程序的元数据引用仍然显示为4.0:
// Metadata version: v4.0.30319

我尝试仅安装了 .NET 4.0 的情况下启动 Windows 7 应用程序,它可以启动,但如果唯一确定 所有 功能是否正常的方法是通过测试 所有, 那么我更愿意先尝试一些更多的方式来确定它是否使用了正确的版本。

那么这种可能性存在吗?

2个回答

17

打开 ildasm.exe 并查看清单。您将会看到 TargetFrameworkAttribute

.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = 
( 01 00 1A 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B   // ....NETFramework
  2C 56 65 72 73 69 6F 6E 3D 76 34 2E 35 01 00 54   // ,Version=v4.5..T
  0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C   // ..FrameworkDispl
  61 79 4E 61 6D 65 12 2E 4E 45 54 20 46 72 61 6D   // ayName..NET Fram
  65 77 6F 72 6B 20 34 2E 35 )                      // ework 4.5

CLR使用此属性验证机器上是否存在正确的版本,如果不存在,会提示用户自动安装。


太快了,让我跟不上!:D 我加了我找到的 MSDN 链接。 - leppie
谢谢,那么现在它确实会生成4.0的程序集。少了一个担心 :) - Lasse V. Karlsen
我还在LINQPad中运行了这一行代码:Assembly.LoadFrom(@"d:\dev\vs.net\app451\app451\bin\debug\app451.exe").GetCustomAttributes(typeof(TargetFrameworkAttribute)).Dump();,它生成了程序集版本。 - Lasse V. Karlsen
TargetFramework并不能告诉你DLL需要哪个版本,它只能告诉你目标是什么。如果你没有安装参考程序集,你可能会认为4.0目标依赖于4.0,但实际上它们依赖于v.Whatever,其中“Whatever”是msbuild找到的第一个.NET DLL。 - EKW

-1

元数据版本v4.0.30319适用于.Net 4.0。请参见此处

生成 版本号

1.0 - 1.0.3705

1.1 - 1.1.4322.573

2.0 - 2.0.50727.42

3.0 - 3.0.4506.30

3.5 - 3.5.21022.8

4.0 - 4.0.30319.1

4.5 - 4.5.50709.17929

4.5.1 - 4.5.50938.18408


2
在.NET 4.5.1控制台应用程序的ildasm清单顶部的元数据行也读取4.0.30319,因此我有疑问。然而,@HansPassant的答案给了我答案。 - Lasse V. Karlsen
你所提到的页面(“这里”)根本没有提到“生成版本号”(即使是2014-01-09版本)。在ruro版本中有类似的数字(例如“4.5.50938.18408”),但它们并没有说明这些值与元数据版本有关。 - Igor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接