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