2009-06-01 90 views
4

編譯時,我總是將它設置爲Any CPU。但是,有些客戶沒有所需二進制文件的64位版本,即使在x64系統上運行時也是如此。在這種情況下,我要求他們修改我的二進制與corflags.exe/32BIT +選項:如何以編程方式設置或清除32位標誌?

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

我想使這個透明的,在安裝時修改二進制自己,如果64位版本不存在。我會寧願不要打電話給corflags.exe我自己,因爲這將意味着我需要重新分配的應用程序,這是不允許我們的運輸要求的一部分。

所以我的問題是,有沒有什麼辦法可以自己修改這個標誌,或者直接修改這個二進制文件(只是在文件本身的某處設置一個字節)?

+0

不完全確定你想通過這樣做達到什麼目的? – 2009-06-02 00:20:35

+0

運行速度快兩倍? – 2009-06-02 04:25:51

回答

1

爲什麼不直接爲兩種體系結構(32位和64位)構建您的程序集,都將兩者都包含在您的安裝程序中,然後在安裝時檢測您的客戶機所依賴的此程序集的哪個版本,然後安裝適當的應用程序體系結構版本。這樣就不需要手動修改二進制文件,也不需要在安裝程序中包含corflags。

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)); 

不相信這是一個好主意,這樣做,作爲安裝程序的步驟雖然。

0

如果您可以在安裝過程中檢測到這一點,爲什麼不直接從安裝程序運行corflags.exe?這聽起來好多了,而不是試圖自己改變二進制數據。

3

我還沒有試過這個,但是你能夠在二進制副本上運行corflags,並執行二進制比較來確定哪些偏移被修改。您可以將其作爲安裝腳本的構建操作並將其與安裝程序一起存儲。

如果需要,安裝時只需更改偏移量。

當然,我絕不會贊同這種行爲,只是說

;-)

順便說一句,如果你不斷地需要以紀念在32位大會可以考慮只針對該平臺,而不是在事實之後將其改爲32位。

乾杯。

相關問題