确定DLL的.NET Framework版本


Answers:


49

将其加载到Reflector中,看看它引用了什么?

例如:

在此处输入图片说明


1
我的想法也是,但是了解反射器,它可能会抱怨,并为它提供一个不错的非描述性错误图标。
leppie

@leppie应该不是问题,即使它是.NET 1.1。只需更改您的默认程序集列表即可。
ParmesanCodice 2010年

您的答案非常有帮助,但我建议不要盲目依赖它-昨天我花了太多时间在自己的项目上,该项目针对.Net 4.0,由Reflector报告为使用.Net 4.0.3,并且需要使用.NET 4.5的Windows :-)我不知道验证这一点上比其他来源的任何项目的方法-在这里看到:stackoverflow.com/questions/13214503/...
greenoldman

3
您还可以使用免费的,开源的替代ILSpy指出由吉廉鲁伊斯。
Marcus Mangelsdorf


128

在PowerShell中,可以使用以下命令获取目标运行时:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

我根据Ben Griswold的回答将其改编为PowerShell 。

如果要了解Visual Studio中指定的目标框架版本,请使用:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value

你应该得到类似

.NETFramework,Version = v4.5.2


4
这个答案是最有帮助的。2003年之后的所有Windows操作系统都支持Powershell。提供即时反馈的shell,不需要其他许多答案所建议的任何其他应用程序支持。非常适合dll的“一次性”检查。你是那个男人@swoogan。
内森·麦考伊

1
我对使用TargetFrameworkVersion v3.5构建的DLL进行了此操作,并返回v2.0.50727。我想念什么?
BHSPitMonkey '16

4
@BHSPitMonkey实际上只有四个运行时版本:1.0、1.1、2.0和4.0。.NET 3.0和3.5编译为CLR 2.0版。msdn.microsoft.com/zh-cn/library/bb822049(v=vs.110).aspx
Swoogan 2016年

1
此脚本仅提供RuntimeVersion,有关TargetFrameworkversion的问题。有效地针对所有针对2.0、3.0、3.5编译的程序集,此脚本将运行时版本显示为2.0.0.0
Kiran Vedula '17

3
对我来说,ReflectionOnlyLoadFrom返回ImageRuntimeVersion,但零个CustomAttributes。使用LoadFrom而不是ReflectionOnlyLoadFrom可以得到预期的结果。任何原因?PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
Bernard Vander Beken '18

69

dotPeek是一个很好的(免费)工具来显示此信息。

如果您在使用Reflector时遇到一些问题,那么这是一个不错的选择。

在此处输入图片说明


4
仅供参考,由于一个问题,我从DotPeek切换到JustDecompile:如果您选择“特定版本= false”,则DotPeek将显示一个空版本,而JustDecompile将显示正确的版本。值得为我切换。
ashes999

太好了-完全无需安装Reflector试用版即可实现我想要的功能。
bernhardrusch '16

49

您可以使用ILDASM ...

ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil

并在输出中检查“元数据部分”。就像这样:

元数据部分:0x424a5342,版本:1.1,额外版本:0,len版本:12,版本:v4.0.30319

'version'标签将告诉您.NET Framework版本。在上面的示例中是4.0.30319


3
我在这里找什么?这是否意味着.NET 4.0?// Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX

是的,对于.NET 2,我得到以下信息://元数据部分:0x424a5342,版本:1.1,额外:0,版本len:12,版本:v2.0.50727
Simon

17

您有几个选择:要以编程方式从托管代码中获取它,请使用Assembly.ImageRuntimeVersion:

Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

从v2.0开始,从命令行开始,如果双击“ MANIFEST”并寻找“ Metadata version”,ildasm.exe将显示该文件。确定图像的CLR版本


如何获取CurrentAppDomain的ImageRuntimeVersion?
Kiquenet


15

只是简单

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();

1
我不知道为什么要拒​​绝它,但是我可以运行代码段(需要对System.Runtime.Versioning的引用),并成功获取输出(这是从LINQPad中获得):TypeId typeof(TargetFrameworkAttribute)FrameworkName .NETFramework,版本= v4.0 FrameworkDisplayName .NET Framework 4
Sudhanshu Mishra 2014年

此代码无法检索框架的完整版本。最好知道“ 4.0”,但是如果您想进入RegAsm.exe,则“ v4.0.30319”会更有用。可以在以下位置找到更完整的版本信息:字符串tar = Assembly.LoadFrom(@“ myAssembly.dll”)。ImageRuntimeVersion;
马丁

这似乎是正确的方法,在任何情况下程序集都可能未应用此属性?我已经使用.NET Core程序集对其进行了测试,它可以正确报告netcore和版本号。
亚当·内罗尔

这对我不起作用。在GetCustomAttributes没有一个TargetFrameworkAttribute。但是ImageRuntimeVersion可以正常工作,它会检索二进制文件所针对的正确CLR。我需要为其构建目标框架版本。
Shameel Mohamed

13

通过Visual Studio的另一个选项,将DLL的引用添加到任何项目,然后右键单击新引用,然后单击“属性”,您可以看到在运行时版本中要查找的内容:

在此处输入图片说明


我认为这个问题并不是在Visual Studio中引用DLL的问题,而是您在PC上发现的所有.NET DLL的问题。
ashes999

7
该答案表明,您可以添加对您在PC上发现的所有.NET DLL的引用,并且与该DLL对应的引用下的项目的属性之一是“运行时版本”。
ALEXintlsos

8

使用ILDASM对其进行反编译,然后查看所引用的mscorlib的版本(应该在顶部非常正确)。


4

最简单的方法:只需在任何文本编辑器中打开.dll。看一下最后一行: 在此处输入图片说明


最佳选择
Sisir

2
但是,这不适用于.Net 3.0之前构建的dll
Sisir


2

轻松检测 ”(也称为DiE)是一种用于确定文件类型的程序。适用于.dll文件或其他(.exe)文件。完全免费,可用于商业和非商业用途。

在此处输入图片说明


0

如果您DotPeek来自JetBrains,则可以在中看到它Assembly Explorer

您可以看到此屏幕截图吗? 我不是:(


0

在这里扩展答案,如果有从属程序集,则可能会爆炸。如果您很幸运,并且知道受抚养人在哪里(或者甚至更幸运,它在GAC中),那么这可能会有所帮助...

using System.Reflection;
using System.Runtime.Versioning;
// ...
{
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
    var asm = System.Reflection.Assembly.LoadFrom(@"C:\Codez\My.dll");
    var targetFrameAttribute = asm.GetCustomAttributes(true).OfType<TargetFrameworkAttribute>().FirstOrDefault();
    targetFrameAttribute.Dump();
}

Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    var name = args.Name;

    if (name.StartsWith("Depends"))
        return System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"C:\Codez\Depends.dll");

    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}

参考:https : //weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.