【问题标题】:Determine .NET Framework version for dll确定 dll 的 .NET Framework 版本
【发布时间】:2011-03-28 12:30:16
【问题描述】:

我有一个针对 .NET 框架编译并部署的旧 dll。我不确定它是针对哪个版本的 .NET 框架编译的。我想知道如何确定这个 dll 是针对哪个版本的 .NET 框架编译的?我不能相信源代码,因为我相信它已经升级到 Visual Studio 2008 并更改为 .NET 框架版本 3.5。

【问题讨论】:

标签: .net .net-framework-version


【解决方案1】:

在 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

【讨论】:

  • 这个答案是最有帮助的。 2003 年以后的所有 Windows 操作系统都支持 Powershell。一个提供即时反馈的外壳,不需要任何其他答案所建议的额外应用程序支持。非常适合对 dll 进行“一次性”检查。你就是那个人@swoogan。
  • 我为使用 v3.5 的 TargetFrameworkVersion 构建的 DLL 执行此操作,它返回 v2.0.50727。我错过了什么?
  • @BHSPitMonkey 实际上只有 4 个运行时版本:1.0、1.1、2.0 和 4.0。 .NET 3.0 和 3.5 编译为 CLR 2.0 版。 msdn.microsoft.com/en-us/library/bb822049(v=vs.110).aspx
  • 这个脚本只提供RuntimeVersion,问题是关于TargetFrameworkversion。对于针对 2.0、3.0、3.5 编译的所有程序集,此脚本将运行时版本显示为 2.0.0.0
  • 对我来说,ReflectionOnlyLoadFrom 返回 ImageRuntimeVersion 但零自定义属性。使用 LoadFrom 而不是 ReflectionOnlyLoadFrom 可以得到预期的结果。任何原因? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
【解决方案2】:

dotPeek 是显示此信息的绝佳(免费)工具。

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

【讨论】:

  • 仅供参考,我从 DotPeek 切换到 JustDecompile 是因为一个问题:如果您选择“特定版本 = false”,DotPeek 会显示一个空版本,而 JustDecompile 会显示正确的版本。对我来说值得转换。
  • 太棒了 - 完全符合我的要求,无需为 Reflector 安装试用版。
【解决方案3】:

将其加载到Reflector 并查看它引用了什么?

例如:

【讨论】:

  • 也是我的想法,但是知道反射器,它可能会抱怨,并给它一个漂亮的非描述性错误图标。
  • @leppie 应该不是问题,即使它是 .NET 1.1。只需更改您的默认装配列表即可。
  • 您的回答很有帮助,但我建议不要盲目依赖它——昨天我花了太多时间在自己的项目上,该项目针对.Net 4.0,Reflector 报告使用.Net 4.0.3,并且 Windows 需要使用 .Net 4.5 :-) 我不知道有什么方法可以在项目上验证这一点,而不是使用源代码——请参见此处:stackoverflow.com/questions/13214503/…
  • 您还可以使用免费的开源替代品 ILSpy 作为 Kat Lim Ruiz 的 noted
  • 这个答案对我有用:stackoverflow.com/a/3461027/2961177
【解决方案4】:

你可以使用ILDASM...

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

并检查输出中的“元数据部分”。应该是这样的:

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

“版本”标签将告诉您 .NET Framework 版本。在上面的例子中是 4.0.30319

【讨论】:

  • 我在这里找什么?这是否意味着 .NET 4.0? // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
  • 是的,对于 .NET 2,我得到以下信息: // 元数据部分:0x424a5342,版本:1.1,额外:0,版本 len:12,版本:v2.0.50727
【解决方案5】:

您有几个选择:要以编程方式从托管代码中获取它,请使用 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

【讨论】:

  • 如何获取 CurrentAppDomain 的 ImageRuntimeVersion ?
【解决方案6】:

使用 ILSpy http://ilspy.net/

开源,免费,绝对是一种选择,因为现在反射器是付费的。

【讨论】:

    【解决方案7】:

    只是简单

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

    【讨论】:

    • 我不知道为什么这被否决了,但我可以运行 sn-p(需要对 System.Runtime.Versioning 的引用)并成功获得输出(这是来自 LINQPad) : TypeId typeof (TargetFrameworkAttribute) FrameworkName .NETFramework,Version=v4.0 FrameworkDisplayName .NET Framework 4
    • 此代码不检索框架的完整版本。知道“4.0”很不错,但如果您想访问 RegAsm.exe,“v4.0.30319”会更有用。更完整的版本信息可以在:string tar = Assembly.LoadFrom(@"myAssembly.dll").ImageRuntimeVersion;
    • 这似乎是正确的方法,是否存在程序集可能未应用此属性的任何情况?我已经使用 .NET Core 程序集对其进行了测试,它正确地报告了 netcore 和版本号。
    • 这对我不起作用。 GetCustomAttributes 没有 TargetFrameworkAttribute。但是 ImageRuntimeVersion 工作正常,它检索了构建二进制文件的正确 CLR。我需要构建它的目标框架版本。
    【解决方案8】:

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

    【讨论】:

    • 我认为这个问题不是询问何时在 Visual Studio 中引用 DLL,而是询问您在 PC 上发现的任何 .NET DLL。
    • 这个答案表明您可以添加对您在 PC 上发现的任何 .NET DLL 的引用,并且与该 DLL 对应的引用下的项目的属性之一是“运行时版本”。
    【解决方案9】:

    使用 ILDASM 对其进行反编译,并查看所引用的 mscorlib 版本(应该几乎在顶部)。

    【讨论】:

      【解决方案10】:

      最简单的方法:只需在任何文本编辑器中打开 .dll。看看最后一行:

      【讨论】:

      • 最好的选择
      • 但是,这对于在 .Net 3.0 之前构建的 dll 不起作用
      【解决方案11】:

      我快速编写了这个 C# 控制台应用程序来执行此操作:

      https://github.com/stuartjsmith/binarydetailer

      只需将目录作为参数传递,它会尽力告诉您其中每个 dll 和 exe 的网络框架

      【讨论】:

      • 提供详细的信息;它是一个命令行应用程序;您必须在命令行上将目录名称传递给它。
      【解决方案12】:

      Detect It Easy”也称为 DiE 是一个用于确定文件类型的程序。适用于 .dll 文件或其他 (.exe) 文件。完全免费用于商业和非商业用途。

      【讨论】:

        【解决方案13】:

        如果您有来自 JetBrains 的 dotPeek,您可以在 Assembly Explorer 中看到它。

        【讨论】:

          【解决方案14】:

          在这里扩展答案,如果存在依赖程序集,这可能会爆炸。如果你很幸运并且知道受抚养人在哪里(或者更幸运的是,它在 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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-14
            • 1970-01-01
            • 2010-12-06
            • 1970-01-01
            • 2011-06-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多