编译时,我总是为任何CPU设置它。但是,有些客户没有64位版本的必需二进制文件,即使在x64系统上运行也是如此。在这些情况下,我要求他们使用corflags.exe / 32BIT +选项修改我的二进制文件:
http://msdn.microsoft.com/en-us/library/ms164699(VS.80).aspx
如果64位版本不存在,我想在安装期间自己修改二进制文件。我希望更喜欢不要自己调用corflags.exe,因为这意味着我需要重新分发应用程序,这是我们的运输要求中不允许的。
所以我的问题是;有没有办法以程序方式自己修改这个标志,或者直接修改二进制文件(它只是在文件本身的某处设置一个字节)?
答案 0 :(得分:3)
我没有尝试过这个但是你能够在二进制文件的副本上运行corflags并执行二进制diff以确定修改了哪个偏移量。您可以将此作为安装脚本的构建操作,并使用安装程序存储偏移量。
在安装时,只需更改偏移量即可。
当然,我绝不赞同这样的行动,只是说'
- )
顺便说一句,如果你不断需要为32位标记程序集,你可以考虑只针对该平台,而不是事后将其改为32位。
干杯。
答案 1 :(得分: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位运行时工作,因此只将相同的程序集加载到另一个运行时将无法正常工作。
编辑:快速和脏样本阅读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));
不相信这是一个好主意,但作为安装程序步骤。
答案 2 :(得分:1)
为什么不专门为两种体系结构(32位和64位)构建程序集,包括在安装程序中,然后在安装时检测客户端具有此依赖程序集的版本,然后安装相应的您的应用程序的架构版本。这样就无需手动修改二进制文件或者需要在安装程序中包含corflags。
答案 3 :(得分:0)
如果您可以在安装过程中检测到这一点,为什么不直接从安装程序运行corflags.exe?这对我来说听起来要好得多,而不是试图自己改变二进制数据。