Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查文件是否为.NET程序集_C#_.net_Reflection_Clr - Fatal编程技术网

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

C# 检查文件是否为.NET程序集,c#,.net,reflection,clr,C#,.net,Reflection,Clr,我见过一些解决问题的方法 这是测试多个文件的最快方法吗?我假设尝试加载每个文件(例如,通过)可能会非常慢,因为它将加载文件类型信息 注意:我正在寻找一种以编程方式检查文件的方法。这里的第一个链接将是最快、最简单的检查方法(PE文件头)。假设调用Assembly.ReflectionOnlyLoad将非常缓慢,这是正确的 也许这有帮助 从 接下来,我检查它是否是.NET程序集。为此,我检查文件是否包含CLR头。此标头包含有关.NET代码在文件中的位置以及用于编写该代码的框架版本的重要信息。此标头的

我见过一些解决问题的方法

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


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

这里的第一个链接将是最快、最简单的检查方法(PE文件头)。假设调用Assembly.ReflectionOnlyLoad将非常缓慢,这是正确的

也许这有帮助

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

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


过去我使用过AssemblyName.GetAssemblyName(),如果它不是托管程序集,则会引发异常。然而,我从来没有测试过它的性能,所以我不能说它有多快


我想Stormenet的答案在技术上是不符合程序的,所以我将把我的回答分成一个答案

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

与验证某个文件是否为DOS可执行文件的方式大致相同:


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

这很有帮助,但我正在寻找一个程序检查。你有其他链接吗?(当前链接已断开)我有一个.NET程序集,在COM描述符目录下有一个
0
。可能是因为品沃克的电话
Assembly.GetAssemblyName()
似乎是可靠检查它是否为.NET程序集的唯一方法…异常为System.BadImageFormatException