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

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

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

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


person Jon Galloway    schedule 01.12.2008    source источник


Ответы (4)


Может это поможет

с 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 присутствует, он инициализирует среду выполнения и передает точку входа сборки в среду выполнения, так что файл полностью запускается во время выполнения.

person Stormenet    schedule 01.12.2008
comment
Это полезно, но я ищу программную проверку. - person Jon Galloway; 01.12.2008
comment
У вас есть другая ссылка? (текущая ссылка не работает) - person Fab; 09.11.2015
comment
У меня есть сборка .NET с 0 в каталоге дескрипторов COM. Возможно, из-за вызовов PInvoke. Assembly.GetAssemblyName() кажется ЕДИНСТВЕННЫМ СПОСОБОМ надежно проверить, является ли это сборкой .NET... - person Daniel Fisher lennybacon; 05.08.2019

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

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

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

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

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

person Jeff Atwood    schedule 01.12.2008

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

Официальная документация

person Kevin Dente    schedule 01.12.2008
comment
Исключением является System.BadImageFormatException - person Stephen Oberauer; 23.07.2012

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

person Jeff Hubbard    schedule 01.12.2008