2009-06-01 1 views
4

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

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

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

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

+0

не совсем уверен, чего вы пытаетесь достичь, сделав это? –

+0

Выполняется в два раза быстрее ??? –

+0

Альтернативным решением может быть включение 64-разрядной версии используемой библиотеки, если пользователь имеет 32-битную версию и работает на 64-битной машине, локальная версия будет находиться в пути поиска с вашим приложением и должна загружать , –

ответ

1

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

+0

Я склоняюсь к этому теперь, я просто надеялся избежать распространения 2 бинарных файлов. – esac

+0

Я строю как X86, так и AnyCPU, но он удваивает размер установщика. Мы создали простую программу установки, которая определяет, какую версию установить (на основе типа установки Office 32/64). Было бы неплохо сообщить установщику, какую версию установить из AnyCPU, а не объединять оба, и форсировать X86 на X64, установив только MSI x86. – Dave

1

Для самого файла, я верю (не подтвердил), вы можете просто изменить 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-битной версии, поэтому загрузка одной и той же сборки в другую среду выполнения не будет работать.

Edit: быстрый и грязный образец читать 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

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

3

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

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

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

;-)

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

Cheers.