代码之家  ›  专栏  ›  技术社区  ›  Jon Galloway

检查文件是否为.NET程序集

  •  11
  • Jon Galloway  · 技术社区  · 16 年前

    我见过一些方法 checking if a PEFile is a .NET assembly by examining the binary structure .

    这是测试多个文件的最快方法吗?我假设尝试加载每个文件(例如通过 Assembly.ReflectionOnlyLoad )文件可能非常慢,因为它将加载文件类型信息。

    注意:我正在寻找一种以编程方式检查文件的方法。

    4 回复  |  直到 6 年前
        1
  •  6
  •   Daniel Fisher lennybacon mythz    6 年前

    也许这有帮助

    https://web.archive.org/web/20110930194955/http://www.grimes.demon.co.uk/dotnet/vistaAndDotnet.htm

    接下来,我检查它是否是.NET程序集。为此,我检查文件是否包含clr头。此头包含有关.NET代码在文件中的位置以及用于编写该代码的框架版本的重要信息。此头的位置在文件的数据目录表中给出。如果数据目录项的值为零,则该文件为非托管文件;如果该文件的值为非零,则该文件为.NET程序集。

    您可以使用dumpbin实用程序和/headers开关自行测试。该实用程序将在命令行上的一个文件中打印各种头文件。在可选头值的末尾,您将看到一个数据目录列表(总是有16个),如果COM描述符目录的位置为非零,则表示该文件是.NET程序集。也可以使用/clr header开关列出clr头的内容(如果文件未被管理,则不会显示任何值)。xp在执行文件时测试clr头,如果存在clr头,它将初始化运行时并将程序集的入口点传递给运行时,以便文件完全在运行时内运行。

        2
  •  7
  •   Jeff Atwood    16 年前

    我想斯图梅特的答案不是技术上的 纲领性的 ,所以我会把我的回答分成一个答案。

    为了获得最佳性能,没有什么比用 StreamReader ,读取第一(n)个字节并检查字节流中的.NET文件签名数据结构。

    与验证DOS可执行文件的方式几乎相同:

    http://en.wikipedia.org/wiki/DOS_executable

    寻找“mz”头字节,它恰好也是MS-DOS开发人员之一mark zbikowski的缩写。

        3
  •  5
  •   Michael Stum    16 年前

    在过去,我使用了assemblyname.getassemblyname(),如果它不是托管程序集,则会引发异常。但是,我从未测试过它的性能,所以我不能说它有多快。

        4
  •  1
  •   Jeff Hubbard    16 年前

    这里的第一个链接将是最快和最简单的检查方法(PE文件头一个)。假设调用assembly.reflectiononlyad的速度会非常慢,这是正确的。