Проверка того, является ли файл сборкой .NET

Я видел некоторые методы проверки, является ли PEFile сборкой .NET, исследуя двоичную структуру.

Это самый быстрый способ тестирования нескольких файлов? Я предполагаю, что попытка загрузить каждый файл (например, через Assembly.ReflectionOnlyLoad) файл может быть довольно медленным, так как он будет загружать информацию о типе файла.

Примечание. Я ищу способ проверить файлы программным способом.

Ответ 1

Возможно, это помогает

из http://www.grimes.nildram.co.uk/dotnet/vistaAndDotnet.htm

Затем я проверяю, является ли это сборкой .NET. Для этого я проверяю, содержит ли файл заголовок CLR. Этот заголовок содержит важную информацию о местонахождении .NET-кода в файле и версии фреймворка, который использовался для написания этого кода. Местоположение этого заголовка указывается в таблице данных Data Directory. Если элемент каталога данных имеет нулевые значения, то файл неуправляемый, если он имеет ненулевые значения, тогда файл представляет собой сборку .NET.

Вы можете проверить это самостоятельно, используя утилиту dumpbin с переключателем /headers. Эта утилита будет печатать различные заголовки в файле в командной строке. В конце дополнительных значений заголовка вы увидите список каталогов данных (их всегда будет 16), и если в каталоге дескриптора COM есть ненулевое местоположение, это указывает на то, что этот файл является сборкой .NET. Содержимое заголовка CLR также может быть указано с помощью переключателя /clrheader (если файл неуправляемый, это не покажет никаких значений). XP для заголовка CLR, когда он выполняет файл, и если присутствует CLR-заголовок, он инициализирует среду выполнения и передает точку входа сборки во время выполнения, чтобы файл полностью выполнялся в пределах среды выполнения.

Ответ 2

Я думаю, что ответ Сторменета не является технически программным, поэтому я отвечу на ответ в ответ.

Для достижения максимальной производительности ничто не превзойдет открытие файла (ов) с помощью StreamReader, чтение первых (n) байтов и проверку структур данных подписи .NET в потоке байтов.

Совсем точно так же, как вы что-то проверяете, является исполняемый файл DOS:

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

Ищите байты заголовков "MZ", которые также являются инициалами Марка Збиковского, одного из разработчиков MS-DOS.

Ответ 3

В прошлом я использовал AssemblyName.GetAssemblyName(), который генерирует исключение, если это не управляемая сборка. Тем не менее, я никогда не тестировал его, поэтому не могу сказать, насколько это быстро.

Ответ 4

Первая ссылка будет самым быстрым и простым методом проверки (заголовок PE файла). Вы правы, полагая, что вызов Assembly.ReflectionOnlyLoad будет довольно медленным.