Это самый быстрый способ протестировать несколько файлов? Я предполагаю, что попытка загрузить каждый файл (например, через Assembly.ReflectionOnlyLoad) может быть довольно медленным, так как будет загружаться информация о типе файла.
Примечание. Я ищу способ программной проверки файлов.
Затем я проверяю, является ли это сборкой .NET. Для этого я проверяю, содержит ли файл заголовок CLR. Этот заголовок содержит важную информацию о расположении кода .NET в файле и версии платформы, которая использовалась для написания этого кода. Расположение этого заголовка указано в таблице каталога данных файла. Если элемент каталога данных имеет нулевые значения, то файл является неуправляемым, если он имеет ненулевые значения, то файл является сборкой .NET.
Вы можете проверить это самостоятельно, используя утилиту dumpbin с ключом /headers. Эта утилита будет печатать различные заголовки в файле в командной строке. В конце необязательных значений заголовка вы увидите список каталогов данных (всегда их будет 16), и если каталог дескриптора COM имеет ненулевое местоположение, это указывает, что файл является сборкой .NET. Содержимое заголовка CLR также можно просмотреть с помощью переключателя /clrheader (если файл неуправляемый, значения не отображаются). XP проверяет заголовок CLR при выполнении файла, и если заголовок CLR присутствует, он инициализирует среду выполнения и передает точку входа сборки в среду выполнения, так что файл полностью запускается во время выполнения.
personStormenetschedule01.12.2008
comment
Это полезно, но я ищу программную проверку.
- personJon Galloway; 01.12.2008
comment
У вас есть другая ссылка? (текущая ссылка не работает)
- personFab; 09.11.2015
comment
У меня есть сборка .NET с 0 в каталоге дескрипторов COM. Возможно, из-за вызовов PInvoke. Assembly.GetAssemblyName() кажется ЕДИНСТВЕННЫМ СПОСОБОМ надежно проверить, является ли это сборкой .NET...
- personDaniel Fisher lennybacon; 05.08.2019
Я предполагаю, что ответ Stormenet технически не является программным, поэтому я разделю свой ответ на ответ.
Для лучшей производительности ничто не сравнится с открытием файла(ов) с помощью StreamReader, чтением первых (n) байтов и проверкой структур данных подписи файла .NET в потоке байтов.
Почти так же, как вы проверяете, что что-то является исполняемым файлом DOS:
Раньше я использовал AssemblyName.GetAssemblyName(), которая генерирует исключение, если это не управляемая сборка. Тем не менее, я никогда не тестировал его производительность, поэтому не могу сказать, насколько он быстрый.
Первая ссылка будет самым быстрым и простым способом проверки (заголовок PE-файла). Вы правы, полагая, что вызов Assembly.ReflectionOnlyLoad будет довольно медленным.