当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《检查文件是否是.NET程序集》经验,为你挑选了3个好方法。

通过检查二进制结构,我已经看到了一些检查PEFile是否是.NET程序集的方法.

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

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



1> Jeff Atwood..:

我猜Stormenet的答案在技术上并不是程序化的,所以我会将我的回答分成一个答案.

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

几乎与验证某些东西是DOS可执行文件的方式相同:

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

寻找"MZ"头字节,这也恰好是MS-DOS开发人员之一Mark Zbikowski的缩写.



2> Stormenet..:

也许这有帮助

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

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

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



3> Kevin Dente..:

在过去,我使用了AssemblyName.GetAssemblyName(),如果它不是托管程序集,则抛出异常.但是,我从来没有对它进行性能测试,所以我不能说它有多快.


System.BadImageFormatException是一个例外
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有