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

Kla*_*sen 50 .net assemblies version

从命令行(或通过任何方式),我如何确定.NET程序集所需的CLR版本?

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

Dar*_*rov 53

ildasm.exe如果您双击"MANIFEST"并查找"元数据版本",将显示它.默认情况下,它是编译图像的版本.


Fer*_*hez 34

一个澄清......

所有提到的方法的问题是,如果程序集是针对.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);
Run Code Online (Sandbox Code Playgroud)

将返回

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
Run Code Online (Sandbox Code Playgroud)

  • 当然,这不适用于为版本 &lt; 4 编译的程序集,因为它们中没有该属性。也就是说,如果您想找出已编译程序集的 *target*(不是运行时目标)是什么,并且该程序集早于 v4,这将不起作用。 (2认同)

Meh*_*ari 33

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

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


Rob*_*nto 10

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

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

[System.Reflection.Assembly]::LoadFrom("C:\...\MyAssembly.dll").ImageRuntimeVersion
Run Code Online (Sandbox Code Playgroud)

默认情况下,PowerShell使用.NET v2运行时,因此您将获得针对v4的程序集的例外.Stack Overflow问题如何使用.NET 4运行时运行PowerShell?详细说明如果需要,可以更改方法.


Tin*_*nku 5

从命令行

DUMPBIN你的dll/exe/CLRHEADER

  • 我得到了一堆神秘的标志,包括"2.05运行时版本",但这是一个.NET 4.0程序集. (3认同)

And*_*ren 5

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

 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
Run Code Online (Sandbox Code Playgroud)

使用:

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"
Run Code Online (Sandbox Code Playgroud)