确定程序集的框架(CLR)版本

从命令行(或者真的如此),我怎样才能确定.NET程序集需要哪个CLR版本?

我需要确定程序集是否需要2.0或4.0 CLR版本。

ildasm.exe将显示它,如果你双击“清单”,并寻找“元数据版本”。 默认情况下,它是编译映像的版本。

 class Program { static void Main(string[] args) { System.Console.WriteLine( System.Reflection.Assembly.LoadFrom(args[0]).ImageRuntimeVersion); } } 

在最新的.NET Framework下编译并运行上述应用程序(因为较旧的CLR可能无法加载需要更新的CLR的程序集),并运行它将path传递到要检查的程序集作为命令行参数。

一个澄清…

所有提到的方法的问题是,如果程序集是针对.NET Framework 4.0,4.5或4.5.1编译的,它们将返回版本4.0。

例如,在运行时以编程方式计算出此版本的方法是使用System.Runtime.Versioning.TargetFrameworkAttribute作为给定的程序集,例如

 using System; using System.Linq; using System.Reflection; using System.Runtime.Versioning; ... object[] list = Assembly.GetExecutingAssembly().GetCustomAttributes(true); var attribute = list.OfType<TargetFrameworkAttribute>().First(); Console.WriteLine(attribute.FrameworkName); Console.WriteLine(attribute.FrameworkDisplayName); 

将返回

 a.FrameworkName ".NETFramework,Version=v4.0" string a.FrameworkDisplayName ".NET Framework 4" string a.FrameworkName ".NETFramework,Version=v4.5" string a.FrameworkDisplayName ".NET Framework 4.5" string a.FrameworkName ".NETFramework,Version=v4.5.1" string a.FrameworkDisplayName ".NET Framework 4.5.1" string 

下面是另一个答案中提供的.NET代码的PowerShell等价物。 使用PowerShell意味着您可以跳过创build和编译程序集等几个步骤。

在PowerShell提示符下,运行以下命令:

 [System.Reflection.Assembly]::LoadFrom("C:\...\MyAssembly.dll").ImageRuntimeVersion 

默认情况下,PowerShell使用.NET v2运行时,所以你会得到一个针对v4组件的exception。 堆栈溢出问题如何运行.NET 4运行时PowerShell? 详细说明了如果需要的话更改的方法。

从命令行

DUMPBIN你的DLL / EXE / CLRHEADER

我build议使用ReflectionOnlyLoadFrom()的LoadFrom()

它有一个优点,它可以在x86机器上运行时加载x64和ia64程序集,而LoadFrom()将无法执行此操作。

虽然它仍然不会从2.0 powershell加载.NET 4.0程序集。

如@mistikabuild议的那样,最好使用ReflectionOnlyLoadFrom()而不是LoadFrom() 。 这样做的缺点就是调用GetCustomAttributes()对使用ReflectionOnlyLoadFrom()加载的程序集会引发exception。 你需要调用GetCustomAttributesData()来代替:

 var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath); var customAttributes = assembly.GetCustomAttributesData(); var targetFramework = customAttributes.FirstOrDefault(attr => attr.AttributeType.Equals(typeof(TargetFrameworkAttribute))); var frameworkName = string.Empty; var frameworkDisplayName = string.Empty; if (null != targetFramework) { if(targetFramework.ConstructorArguments.Any()) { // first argument is the name of the framework. frameworkName = (string)targetFramework.ConstructorArguments[0].Value; } // search for a named argument called "FrameworkDisplayName" var frameworkDisplayNameArg = targetFramework.NamedArguments.FirstOrDefault(arg => arg.MemberName.Equals("FrameworkDisplayName")); if (null != frameworkDisplayNameArg) { frameworkDisplayName = (string)frameworkDisplayNameArg.TypedValue.Value; } } Console.WriteLine("Framework Name: " + frameworkName); Console.WriteLine("Framework Display Name: " + frameworkDisplayName); 

一个非常好的工具是Telerik的JustDecompile。 您可以打开程序集,该工具显示它们的目标是4.5,4.5.1还是4.6

如果要将结果包含在脚本中,则build议使用ildasm.exe的文本输出,然后从输出中grep“Version String”。

 "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe" /text D:\LocalAssemblies\Toolfactory.Core.BaseTypes.dll /noil /headers | find "' Version String" 

注意我包含一个'所以find命令不能识别“版本string长度”

试试这个Assembly Information可执行文件来获得程序集版本,它告诉你它需要的CLR版本,以及编译选项, 目标处理器和引用等其他信息:

在这里输入图像描述