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

时间:2010-02-22 12:02:37

标签: .net assemblies version

从命令行(或者通过任何方式),如何确定CLR程序集需要哪个.NET版本?

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

12 个答案:

答案 0 :(得分:52)

如果您双击“MANIFEST”并查找“元数据版本”,

ildasm.exe将显示该信息。默认情况下,它是编译图像的版本。

答案 1 :(得分:33)

一个澄清......

所有提到的方法的问题是,如果汇编是针对.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

答案 2 :(得分:32)

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

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

答案 3 :(得分:9)

这是另一个答案中建议的PowerShell等效的.NET代码。使用PowerShell意味着您可以跳过几个步骤,例如创建和编译程序集。

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

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

默认情况下,PowerShell使用.NET v2运行时,因此您将获得针对v4的程序集的异常。 Stack Overflow问题 How can I run PowerShell with the .NET 4 runtime? 详细说明了根据需要更改的方法。

答案 4 :(得分:5)

从命令行

DUMPBIN你的dll / exe / CLRHEADER

答案 5 :(得分:4)

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

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

虽然它仍然无法从2.0 PowerShell加载.Net 4.0程序集。

答案 6 :(得分:2)

正如@mistika建议的那样,最好使用ReflectionOnlyLoadFrom()而不是LoadFrom()。这样做的缺点是在加载了GetCustomAttributes()的程序集上调用ReflectionOnlyLoadFrom()会引发异常。您需要拨打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);

答案 7 :(得分:2)

这是一个功能强大的衬垫,它将显示针对v4及更高版本的程序集的 Target框架版本

 Resolve-Path($args) | Select @{N='Assembly'; E={$_ }}, @{N='TargetFramework'; E={(([Reflection.Assembly]::ReflectionOnlyLoadFrom($_).GetCustomAttributesData() | Where-Object { $_.AttributeType -like "System.Runtime.Versioning.TargetFrameworkAttribute" })).NamedArguments.TypedValue}} | Format-Table

使用:

C:\test\> show-targetfw.ps1 *.dll

Assembly             TargetFramework
--------             --------
C:\test\a.dll        ".NET Framework 4.6.1"
C:\test\b.dll        ".NET Framework 4.5.2"

答案 8 :(得分:1)

一个非常好的工具是来自Telerik的JustDecompile。您可以打开装配体,该工具显示它们是否针对4.5,4.5.1或4.6

答案 9 :(得分:0)

如果要在脚本中包含结果,我建议使用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命令无法识别“Version String Length”

答案 10 :(得分:0)

我用ILSpy代替Reflector。如果在ILSpy中打开程序集,则可以看到例如:

[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]

答案 11 :(得分:-1)

尝试使用此Assembly Information可执行文件来获取程序集版本,它会告诉您所需的CLR版本以及其他信息 例如编译选项,目标处理器和参考:

enter image description here