32/64-bit exe, dll
Part 1. 64 ビット Windows OS の基本知識
- アプリケーションを 64/32 ビットどちらで起動するのかは PE ヘッダー情報に基づいて行われる。
- .dll ファイルにも x86 版、x64 版、IA64 版の区別が存在する。
- .dll ファイルに関しては、ひとつのプロセスの中に同じタイプのものしか共存させることができない、というルールが存在している
- 64 ビットプロセスの中に 32 ビット DLL ファイルをロードしたり、32 ビットプロセスの中に 64 ビット DLL ファイルをロードしたりすることはできない。
MS: Part 1. 64 ビット Windows OS の基本知識
Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
- .NET Framework では、IL (中間言語)と呼ばれるものが利用されているため、x86, x64, IA64 すべてに対応する .exe ファイルや .dll ファイルを作成することができる。
- .NET のアプリケーションコードはまずコンパイル時に MSIL (Microsoft Intermediate Language)と呼ばれる中間言語コードに変換される。そして実行時に CLR ランタイムがこれをネイティブコード(x86 や x64 用の命令コード)に変換し、そして CPU 上で実行する。
- プラットフォームスイッチ (AnyCPU, x86, x64) は PE ヘッダ情報内のフラグを変更するものであり、アセンブリファイルに出力される MSIL コードそのものを変えるものではない。
- .dll ファイルは、プロセスからロードされて利用されるライブラリなので、クラスライブラリ側に、プロセスの動作モード(32 ビット/64 ビット)を切り替える権利や機能はない。最初に .exe ファイルを起動した時点で、プロセスの動作モード(32 or 64 ビット)はすでに決定しており、そこから呼び出せるかどうかが .dll ファイルのスイッチにより決定される。
- C# や VB のコードのみで完結しているアプリケーションであれば 32, 64 ビットどちらでも動作できるが、Unmanaged ライブラリを呼び出している場合(Jet OLE DB など)には、x64, x86 の両方に対応できないアプリケーションとなる場合がある。
MS: Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
Part 3. ASP.NET 2.0 Web アプリケーションの 64 ビット対応
MS: Part 3. ASP.NET 2.0 Web アプリケーションの 64 ビット対応
ツール
corflags
PE ファイルヘッダーの CorFlags セクションを設定できる。
出力結果の意味
CPU Architecture | PE | 32BITREQ | 32BITPREF |
---|---|---|---|
x86 (32-bit) | PE32 | 1 | 0 |
x64 (64-bit) | PE32+ | 0 | 0 |
Any CPU | PE32 | 0 | 0 |
Any CPU 32-Bit Preferred | PE32 | 0 | 1 |
- MS: CorFlags.exe (CorFlags Conversion Tool)
- section II.25.3.3.1 Runtime flags of the ECMA-335 specification
- Interpreting the CorFlags flags
dumpbin
COFF バイナリファイルに関する情報を表示できる。
ildasm
.NET で生成された dll ファイル等を MSIL (Microsoft Intermediate Language) に逆アセンブルできる。