.NET DLL は「AnyCPU」で両対応可能?その仕組みと注意点

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 を呼び出す場合は注意が必要です。

例えば:

 
[DllImport("MyNative.dll")]
public static extern int MyFunction();

この場合、呼び出す先の MyNative.dll が 32bit なのか 64bit なのかを一致させなければなりません。

  • 32bit プロセス(EXE)が起動 → 32bit DLL が必要

  • 64bit プロセス(EXE)が起動 → 64bit DLL が必要

つまり、AnyCPU DLL 自体は両対応できるが、P/Invoke 先のネイティブ DLL は両方用意する必要があるということです。


まとめ

  • AnyCPU でビルドした .NET DLL は両対応可能
    → 実行環境に応じて 32bit/64bit の CLR 上で動作する

  • ただし P/Invoke でネイティブ DLL を呼び出す場合は、ネイティブ DLL を 32bit/64bit 両方用意する必要がある

  • 純粋な .NET コードだけで作られたライブラリであれば、1つの DLL ファイルで両対応できるのが大きなメリット