【发布时间】:2011-03-28 12:30:16
【问题描述】:
我有一个针对 .NET 框架编译并部署的旧 dll。我不确定它是针对哪个版本的 .NET 框架编译的。我想知道如何确定这个 dll 是针对哪个版本的 .NET 框架编译的?我不能相信源代码,因为我相信它已经升级到 Visual Studio 2008 并更改为 .NET 框架版本 3.5。
【问题讨论】:
标签: .net .net-framework-version
我有一个针对 .NET 框架编译并部署的旧 dll。我不确定它是针对哪个版本的 .NET 框架编译的。我想知道如何确定这个 dll 是针对哪个版本的 .NET 框架编译的?我不能相信源代码,因为我相信它已经升级到 Visual Studio 2008 并更改为 .NET 框架版本 3.5。
【问题讨论】:
标签: .net .net-framework-version
在 PowerShell 中,您可以使用以下命令获取目标运行时:
$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion
我将其从 Ben Griswold's answer 改编为 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
【讨论】:
dotPeek 是显示此信息的绝佳(免费)工具。
如果您在使用 Reflector 时遇到一些问题,那么这是一个不错的选择。
【讨论】:
将其加载到Reflector 并查看它引用了什么?
例如:
【讨论】:
你可以使用ILDASM...
ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil
并检查输出中的“元数据部分”。应该是这样的:
元数据部分:0x424a5342,版本:1.1,额外:0,版本 len: 12、版本:v4.0.30319
“版本”标签将告诉您 .NET Framework 版本。在上面的例子中是 4.0.30319
【讨论】:
// Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
您有几个选择:要以编程方式从托管代码中获取它,请使用 Assembly.ImageRuntimeVersion:
Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion
从命令行,从 v2.0 开始,如果您双击“MANIFEST”并查找“元数据版本”,ildasm.exe 将显示它。 Determining an Image’s CLR Version
【讨论】:
使用 ILSpy http://ilspy.net/
开源,免费,绝对是一种选择,因为现在反射器是付费的。
【讨论】:
只是简单
var tar = (TargetFrameworkAttribute)Assembly
.LoadFrom("yoursAssembly.dll")
.GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();
【讨论】:
GetCustomAttributes 没有 TargetFrameworkAttribute。但是 ImageRuntimeVersion 工作正常,它检索了构建二进制文件的正确 CLR。我需要构建它的目标框架版本。
使用 ILDASM 对其进行反编译,并查看所引用的 mscorlib 版本(应该几乎在顶部)。
【讨论】:
我快速编写了这个 C# 控制台应用程序来执行此操作:
https://github.com/stuartjsmith/binarydetailer
只需将目录作为参数传递,它会尽力告诉您其中每个 dll 和 exe 的网络框架
【讨论】:
“Detect It Easy”也称为 DiE 是一个用于确定文件类型的程序。适用于 .dll 文件或其他 (.exe) 文件。完全免费用于商业和非商业用途。
【讨论】:
如果您有来自 JetBrains 的 dotPeek,您可以在 Assembly Explorer 中看到它。
【讨论】:
在这里扩展答案,如果存在依赖程序集,这可能会爆炸。如果你很幸运并且知道受抚养人在哪里(或者更幸运的是,它在 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
【讨论】: