Получить значение предпочитаемого 32-битного флага из сборки

У меня есть простая программа установки, которая выбрала папку для установки и куст реестра на основе Environment.Is64BitOperatingSystem и ProcessorArchitecture основного исполняемого файла установленного приложения. Например, если ProcessorArchitecture - MSIL, а Windows - 64-битная, я знаю, что приложение будет выполняться как 64-битное, и поэтому оно должно быть установлено в "C:\Program Files", и приложение должно использовать 64-битное представление в реестре Windows.

Но у меня проблема со сборками, скомпилированными в.NET Framework 4.5 с установленным флагом сборки Prefer-32bit. Такое приложение будет работать в 64-битной системе как 32-битный процесс и, следовательно, должно храниться в папке "Program Files (x86)". Однако ProcessorArchitecture этого приложения будет по-прежнему MSIL, поэтому мой алгоритм принятия решения потерпит неудачу. Можно ли получить флаг Prefer-32bit из сборки?

Спасибо

2 ответа

Решение

Метод Module.GetPEKind возвращает флаги PortableExecutableKinds, которые содержат значение Preferred32Bit.

Assembly assembly = Assembly.LoadFile(file);
Module manifest = assembly.ManifestModule;
PortableExecutableKinds kind;
ImageFileMachine platform;
manifest.GetPEKind(out kind, out platform);
if((kind & PortableExecutableKinds.Preferred32Bit) != 0)
{
    //is Prefer-32bit
}

Такое приложение будет работать в 64-битной системе как 32-битный процесс и, следовательно, должно храниться в папке "Program Files (x86)".

Обратите внимание, что исполняемые файлы AnyCPU будут запускаться как запрашиваемые и ВОЗМОЖНЫЕ.

Он может быть запущен как 32-битный или 64-битный, поэтому сказать, что он должен находиться в одной папке или нет, немного странно. Даже если preffered32bit включен, это не значит, что он будет работать как 32-битный процесс.

Если ваше 64-битное приложение запускает ваше приложение AnyCPU, оно будет запускать 64-битный процесс (так как другого варианта нет - в противном случае он зависнет).

Некоторые из архитектур даже не поддерживают 32-битную эмуляцию (процессоры ARM), так что "Предпочитать 32-битную" мало что даст.

Если нет веской веской причины, я предлагаю вам сделать все просто и установить AnyCPU сборки в папку C:\Program Files (x86). Это будет более понятным и простым для понимания.

Ps, технически, сборки AnyCPU помечены как 32bit те, если вы используете PEInspect или аналогичную программу (вы увидите, что они помечены как 32-битные, pedump, как таковые, было бы правильно поместить их в каталог ProgramFilesFolder).

Концепция AnyCPU реализована внутри с помощью.NET Framework.

Другие вопросы по тегам