4

コンパイルするときは、常に任意のCPUに設定します。ただし、x64システムで実行している場合でも、必要なバイナリの64ビットバージョンを持っていないお客様もいます。これらの例では、corflags.exe /32BIT+オプションを使用してバイナリを変更するように依頼しました。

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

64ビットバージョンが存在しない場合は、これを透過的にして、インストール時に自分でバイナリを変更したいと思います。自分でcorflags.exeを呼び出さないことをお勧めします。これは、出荷要件の一部として許可されていないアプリケーションを再配布する必要があることを意味します。

だから私の質問は; このフラグを自分でプログラムで変更する方法はありますか、あるいはバイナリを直接変更する方法はありますか(ファイル自体のどこかにバイトを設定するだけですか)?

4

4 に答える 4

3

私はこれを試していませんが、バイナリのコピーでcorflagsを実行し、バイナリdiffを実行して、変更されたオフセットを判別できますか。これは、インストールスクリプトのビルドアクションとして実行し、インストーラーでオフセットを保存できます。

インストール時に、必要に応じてオフセットを変更するだけです。

もちろん、私はそのような行動を決して支持しません。

;-)

余談ですが、アセンブリに32ビットのマークを付ける必要が継続的にある場合は、事後に32ビットとして変更するのではなく、そのプラットフォームをターゲットにすることを検討してください。

乾杯。

于 2009-06-02T04:16:20.817 に答える
1

具体的には、両方のアーキテクチャ(32ビットと64ビット)のアセンブリをビルドし、両方をインストーラーに含めてから、インストール時に、クライアントにあるこの依存アセンブリのバージョンを検出して、適切なアーキテクチャバージョンをインストールしてください。あなたの申請。このようにして、バイナリを手動で変更したり、インストーラーにcorflagsを含める必要がなくなります。

于 2009-06-02T03:44:39.777 に答える
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));

ただし、これをインストーラーのステップとして実行することをお勧めします。

于 2009-06-02T00:51:59.353 に答える
0

インストール中にこれを検出できる場合は、インストーラーから直接corflags.exeを実行してみませんか?これは、バイナリデータを自分で変更しようとするよりも、私にははるかに良いように聞こえます。

于 2009-06-02T02:40:41.367 に答える