对于文件本身,我相信(尚未确认)您可以自己修改 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));
不相信这是一个好主意,但将其作为安装程序步骤。