Как программно установить или снять флаг 32BIT? - PullRequest
4 голосов
/ 02 июня 2009

При компиляции я всегда устанавливаю его для любого процессора. Однако есть некоторые клиенты, у которых нет 64-битной версии необходимого двоичного файла, даже при работе в системе x64. В этих случаях я попросил их изменить мой двоичный файл с помощью параметра corflags.exe / 32BIT +:

http://msdn.microsoft.com/en-us/library/ms164699(VS.80).aspx

Я бы хотел сделать это прозрачным и изменить двоичный файл самостоятельно во время установки, если 64-разрядная версия отсутствует. Я бы предпочел бы не звонить самому corflags.exe, так как это означало бы, что мне нужно будет перераспределить приложение, которое не разрешено в рамках наших требований к доставке.

Итак, мой вопрос; Есть ли способ изменить этот флаг сам программно, или в качестве альтернативы для непосредственного изменения двоичного файла (это просто установка байта где-то в самом файле)?

Ответы [ 4 ]

3 голосов
/ 02 июня 2009

Я не пробовал этого, однако вы можете запускать corflags для копии двоичного файла и выполнять двоичный анализ, чтобы определить, какое смещение было изменено. Вы можете сделать это как действие сборки вашего установочного скрипта и сохранить смещение с помощью установщика.

Во время установки просто измените смещение, если это необходимо.

Конечно, я бы никогда не одобрил такие действия, просто скажу

; -)

Кроме того, если вам постоянно требуется пометить сборку для 32-битной системы, вы можете рассмотреть возможность нацеливания на эту платформу, а не изменять ее как 32-битную после факта.

Приветствие.

1 голос
/ 02 июня 2009

Почему бы просто не собрать сборки для обеих архитектур (32-битной и 64-битной), включить их в установщик, а затем во время установки определить, какая версия этой зависимой сборки установлен на вашем клиенте, и установить соответствующую архитектурная версия вашего приложения. Таким образом, нет необходимости возиться с модификацией двоичных файлов вручную и не нужно включать corflags в ваш установщик.

1 голос
/ 02 июня 2009

Я считаю, что для самого файла (не подтвердили) вы можете просто изменить IMAGE_COR20_HEADER самостоятельно. Просто установка MinorRuntimeVersion должна сделать свое дело. Вот (несколько устаревшее) объяснение того, как IMAGE_COR20_HEADER используется для определения того, какая среда выполнения загружена: http://blogs.msdn.com/joshwil/archive/2004/10/15/243019.aspx

Почему бы не всегда всегда компилировать для x86, 64-битная среда выполнения дает какую-то выгоду?

Обратите внимание, что некоторый код (interop / P / invoke) будет работать только в 32- или 64-битной среде выполнения, поэтому простая загрузка той же сборки в другую среду выполнения не будет работать.

Редактировать: быстрый и грязный пример для чтения IMAGE_COR20_HEADER:

_pDosHeader = reinterpret_cast<PIMAGE_DOS_HEADER>(_pFileBase);
_pNTHeader = reinterpret_cast<PIMAGE_NT_HEADERS>(_pFileBase + _pDosHeader->e_lfanew);
_pFileHeader = reinterpret_cast<PIMAGE_FILE_HEADER>(&_pNTHeader->FileHeader);
_pOptionalHeader = reinterpret_cast<PIMAGE_OPTIONAL_HEADER>(&_pNTHeader->OptionalHeader);
IMAGE_DATA_DIRECTORY const* entry = NULL;
entry = &pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_COMHEADER];
if (entry->VirtualAddress == 0 || entry->Size == 0  || entry->Size < sizeof(IMAGE_COR20_HEADER)) {
return E_FAIL;
}
pClrHeader = reinterpret_cast<IMAGE_COR20_HEADER*>(RtlImageRvaToVa32(_pNTHeader, _pFileBase, entry->VirtualAddress, 0));

Не уверен, что это хорошая идея сделать это как шаг установщика.

0 голосов
/ 02 июня 2009

Если вы можете обнаружить это во время установки, почему бы просто не запустить corflags.exe из установщика напрямую? Для меня это звучит намного лучше, чем пытаться изменить двоичные данные самостоятельно.

...