Windows アプリ開発では DLL が 32bit 用なのか 64bit 用なのかで悩む場面が多くあります。
しかし、.NET で作られた DLL(マネージド DLL)の場合は、「AnyCPU」オプションでビルドすると 32bit / 64bit の両方に対応できるという特徴があります。
今回は、この「AnyCPU」の仕組みと注意点を解説します。
AnyCPU とは何か?
Visual Studio で .NET アプリやライブラリをビルドするとき、ターゲットプラットフォームを選択できます。
-
x86 → 32bit 専用で動作
-
x64 → 64bit 専用で動作
-
AnyCPU → 32bit/64bit どちらの環境でも動作可能
AnyCPU
でビルドした DLL は、コンパイル時にネイティブコード化されるのではなく、中間言語(IL: Intermediate Language) で保存されます。そして実行時に、現在動作している CLR(Common Language Runtime)に合わせて JIT コンパイルされる仕組みです。
そのため、同じ DLL ファイルでも:
-
32bit プロセス上では 32bit として動作
-
64bit プロセス上では 64bit として動作
となり、両対応が可能になります。
例:AnyCPU の DLL の挙動
-
64bit OS + 64bit アプリ
→ DLL は 64bit としてロードされる -
64bit OS + 32bit アプリ(WOW64 上で実行)
→ DLL は 32bit としてロードされる -
32bit OS
→ DLL は常に 32bit としてロードされる
つまり、DLL 単体で OS やプロセスに追従して動作するのが AnyCPU の大きな利点です。
注意点:P/Invoke の場合は分ける必要がある
ただし、P/Invoke(Platform Invocation Services) を使って ネイティブ DLL を呼び出す場合は注意が必要です。
例えば:
この場合、呼び出す先の MyNative.dll
が 32bit なのか 64bit なのかを一致させなければなりません。
-
32bit プロセス(EXE)が起動 → 32bit DLL が必要
-
64bit プロセス(EXE)が起動 → 64bit DLL が必要
つまり、AnyCPU DLL 自体は両対応できるが、P/Invoke 先のネイティブ DLL は両方用意する必要があるということです。