Я хочу определить, соответствует ли собственная сборка x64 или x86 из приложения с управляемым кодом ( C # ).
Я думаю, что это должно быть где-то в заголовке PE, поскольку загрузчик ОС должен знать эту информацию, но я не смог ее найти. Конечно, я предпочитаю делать это в управляемом коде, но при необходимости могу использовать собственный C ++.
Ответы:
Вы также можете использовать DUMPBIN . Используйте флаг
/headers
или/all
и его заголовок первого файла в списке.64-битный
32-битный
'find' может немного облегчить жизнь:
источник
mspdb100.dll
:(mspdb100.dll
в папку, гдеdumpbin.exe
он находится.DUMPBIN
может бежать после этого. Для меня EXE находится в,<Visual Studio Install folder>\VC\bin
а DLL - в<Visual Studio Install folder>\Common7\IDE
.Это простой способ сделать с помощью CorFlags . Откройте командную строку Visual Studio и введите «corflags [ваша сборка]». Вы получите что-то вроде этого:
Вы смотрите конкретно на PE и 32BIT.
Любой процессор :
PE: PE32
32BIT: 0
x86 :
PE: PE32
32BIT: 1
x64:
PE: PE32 +
32BIT: 0
источник
Этот трюк работает и требует только Блокнота.
Откройте файл dll с помощью текстового редактора (например, Блокнота) и найдите первое вхождение строки
PE
. Следующий символ определяет, является ли dll 32-битной или 64-битной.32 бита:
64 бита:
источник
Magic
Поле изIMAGE_OPTIONAL_HEADER
(хотя нет ничего опционального о заголовке в Windows , исполняемыми образа (файлы DLL / EXE)) покажет вам архитектуру PE.Вот пример получения архитектуры из файла.
На данный момент единственными двумя архитектурными константами являются:
ура
ОБНОВЛЕНИЕ Прошло некоторое время с тех пор, как я опубликовал этот ответ, но я все еще вижу, что он время от времени получает несколько голосов, поэтому я решил, что его стоит обновить. Я написал способ получения архитектуры
Portable Executable
изображения, который также проверяет, скомпилирован ли он какAnyCPU
. К сожалению, ответ на C ++, но его не должно быть слишком сложно перенести на C #, если у вас есть несколько минут для поиска структурWinNT.h
. Если людям интересно, я напишу порт на C #, но если люди не хотят этого, я не буду тратить много времени на это.Функция принимает указатель на изображение PE в памяти (так что вы можете выбрать свой яд в том, как его получить; отображение памяти или чтение всего этого в память ... что угодно).
источник
32BIT
флаг в PE, я не знаю, в голове.Для неуправляемого DLL-файла вам необходимо сначала проверить, является ли он 16-битным DLL-файлом (надеюсь, нет). Затем проверьте
IMAGE\_FILE_HEADER.Machine
поле.Кто-то уже нашел время, чтобы разобраться с этим, поэтому я просто повторю здесь:
источник
Здесь вы можете найти пример реализации C # для
IMAGE_FILE_HEADER
решенияисточник
64-битные двоичные файлы хранятся в формате PE32 +. Попробуй прочитать http://www.masm32.com/board/index.php?action=dlattach;topic=6687.0;id=3486
источник
Откройте dll с помощью шестнадцатеричного редактора, например HxD
Если в 9-й строке стоит «dt», это 64-битный.
Если есть "L." на 9 строчке - 32 бит.
источник
Я переписал решение С ++ в первом ответе в сценарии PowerShell. Скрипт может определять следующие типы файлов .exe и .dll:
это решение имеет некоторые преимущества перед corflags.exe и загрузкой сборки через Assembly.Load на C # - вы никогда не получите BadImageFormatException или сообщение о недопустимом заголовке.
пример использования:
вы можете опустить второй параметр, если вам не нужны подробности
источник
Здесь описан быстрый и, вероятно, грязный способ сделать это: https://superuser.com/a/889267 . Вы открываете DLL в редакторе и проверяете первые символы после последовательности «PE».
источник
Видимо, вы можете найти его в заголовке переносимого исполняемого файла. Утилита corflags.exe может показать, нацелен ли он на x64. Надеюсь, это поможет вам найти больше информации об этом.
источник
>corflags libzmq.dll \n\n ... corflags : error CF008 : The specified file does not have a valid managed header