代码之家  ›  专栏  ›  技术社区  ›  Klaus Byskov Pedersen

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

  •  47
  • Klaus Byskov Pedersen  · 技术社区  · 16 年前

    从命令行(或者通过任何方式),我如何确定 CLR 版本a .NET 组装需要什么?

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

    12 回复  |  直到 14 年前
        1
  •  59
  •   Darin Dimitrov    16 年前

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

        2
  •  38
  •   Measurity    10 年前

    一个澄清。。。

    例如,在运行时以编程方式确定此版本的方法是使用给定程序集的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
    
        3
  •  34
  •   Mehrdad Afshari    16 年前
    class Program {
      static void Main(string[] args) { 
          System.Console.WriteLine(
                 System.Reflection.Assembly.LoadFrom(args[0]).ImageRuntimeVersion);
      }
    }
    

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

        4
  •  12
  •   Community Mohan Dere    9 年前

    这里有一个 PowerShell

    在PowerShell提示下,运行以下操作:

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

    How can I run PowerShell with the .NET 4 runtime?

        5
  •  7
  •   Anders Forsgren    8 年前

    这是一个powershell one liner,它将显示 目标框架版本 适用于目标为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
    

    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"
    
        6
  •  5
  •   Tinku    16 年前

    从命令行

    DUMPBIN您的dll/exe/CLRHEADER

        7
  •  4
  •   mistika    15 年前

    我建议使用ReflectionOnlyLoadFrom()而不是LoadFrom()

    它的一个优点是,在x86机器上运行时,可以加载x64和ia64程序集,而LoadFrom()将无法做到这一点。

    尽管它仍然无法从2.0 powershell加载.Net 4.0程序集。

        8
  •  2
  •   Andy    12 年前

    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);
    
        9
  •  2
  •   xr280xr    7 年前

    我使用ILSpy作为反射器的替代品。如果在ILSpy中打开程序集,您可以看到,例如:

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

        10
  •  1
  •   xforfun    10 年前

        11
  •  0
  •   ferarias    11 年前

    如果希望在脚本中包含结果,我建议使用 ildasm.exe

    "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

        12
  •  -1
  •   yantaq    9 年前

    试试这个 Assembly Information 获取程序集版本的可执行文件,它告诉您它需要的CLR版本以及其他信息 例如编译选项, 目标处理器 及参考资料:

    enter image description here