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

13
4个回答

7
我会尽力帮助您进行翻译。以下是需要翻译的内容:

我想Stormenet的回答在技术上不算是编程的,所以我会把我的回答分成一个答案。

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

基本上,你可以用与验证DOS可执行文件相同的方式来验证某些东西:

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

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

6
Maybe this helps 来自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头文件,则会初始化运行时并将程序集的入口点传递给运行时,以便文件完全在运行时内运行。

这很有帮助,但我正在寻找编程检查。 - Jon Galloway
你有另一个链接吗?(当前链接已失效) - Fab
我有一个.NET程序集,在COM描述符目录中有一个0。可能是由于PInvoke调用引起的。 Assembly.GetAssemblyName()似乎是唯一可靠的检查它是否为.NET程序集的方法... - Daniel Fisher lennybacon

6

过去我使用了AssemblyName.GetAssemblyName(),如果它不是托管程序集,则会抛出异常。但是,我从未对其进行性能测试,因此无法确定其速度有多快。

官方文档


2
例外情况是 System.BadImageFormatException。 - Stephen Oberauer

1

第一个链接将是最快和最简单的检查方法(PE文件头)。您正确地认为调用Assembly.ReflectionOnlyLoad会非常慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接