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 ビット対応

  • ASP.NET Web アプリケーションが64 ビット/32 ビットのどちらで動作するのかは、Web サーバのワーカプロセスの動作モードによって決定される。
  • .aspx ファイルや .asmx ファイルは実行時に .dll ファイルにコンパイルされるが、これらのファイルはすべて Any CPU としてコンパイルされる。この .dll ファイルが 32/64 どちらで動作するのかは、ワーカプロセスの動作モードにより決定される。
  • Web アプリケーションの場合には、Web アプリ側で 32/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

dumpbin

COFF バイナリファイルに関する情報を表示できる。

MS: DUMPBIN Reference

ildasm

.NET で生成された dll ファイル等を MSIL (Microsoft Intermediate Language) に逆アセンブルできる。

Ildasm.exe (IL Disassembler)