Проверка, является ли файл сборкой .NET - PullRequest
11 голосов
/ 01 декабря 2008

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

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

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

Ответы [ 4 ]

7 голосов
/ 01 декабря 2008

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

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

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

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

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

6 голосов
/ 01 декабря 2008

Может быть, это помогает

от 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 также можно перечислить с помощью параметра / clrheader (если файл неуправляемый, это не покажет никаких значений). XP проверяет заголовок CLR, когда он выполняет файл, и, если присутствует заголовок CLR, он инициализирует среду выполнения и передает точку входа сборки в среду выполнения, чтобы файл полностью выполнялся в среде выполнения.

5 голосов
/ 01 декабря 2008

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

1 голос
/ 01 декабря 2008

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

...