答案 0 :(得分:52)
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版本以及其他信息 例如编译选项,目标处理器和参考: