Part 3. ASP.NET 2.0 Web アプリケーションの 64 ビット対応

さて、前回のエントリではコンソールアプリケーションやライブラリアプリケーションの 64 ビット対応について解説しましたが、ASP.NET Web アプリケーションでは、一般に実行時コンパイルが行われるため、動作がちょっと複雑になります。これについて、以下に解説したいと思います。

なお、本エントリの解説は、すべて ASP.NET Web サイトプロジェクトによる Web アプリケーションを前提とします。VS2005 SP1 以降で導入された ASP.NET Web アプリケーションプロジェクトの場合には、一部のコードが先行コンパイルされる形になるため、本エントリの解説内容よりももう少し複雑になります。が、本エントリの内容と前回のエントリの内容を正しく理解すれば、スイッチの付与の仕方はわかると思いますので、このエントリでは Web アプリケーションプロジェクトについては解説対象外としたいと思います。

では、以下の順に解説していくことにします。

64 ビット/32 ビット動作の決定メカニズム

Web サイトプロジェクトを含むソリューションのビルド構成設定

IIS 6 のワーカプロセスの動作ビットモードの変更方法

IIS 7 のワーカプロセスの動作ビットモードの変更方法

64 ビットワーカプロセスの制限事項

開発環境において 64 ビットワーカプロセスを使いたい場合について

[Step. 11] ASP.NET Web アプリケーションの動作ビットの決定メカニズム

まず、結論から記述すると、ASP.NET Web アプリケーションが64 ビット/32 ビットのどちらで動作するのかは、Web サーバのワーカプロセスの動作モードによって決定されます

*.aspx ファイルや *.asmx ファイルは実行時に .dll ファイルにコンパイルされますが、これらのファイルはすべて Any CPU としてコンパイルされます。このため、この .dll ファイルが 32/64 どちらで動作するのかは、ワーカプロセスの動作モードにより決定されます。

例えば、x64 Windows OS 上に Visual Studio 2008 をインストールし、Web サイトプロジェクトを実行した場合には、32 ビット版の ASP.NET 開発サーバが起動します。

image

この場合には、64 ビット OS を使っていても、Web アプリケーションは 32 ビット動作(WOW64 上での動作)となります

image 

また、IIS 6, 7 の場合には、ワーカプロセス(w3wp.exe)に 32 ビット版と 64 ビット版の 2 種類が用意されています(切り替え方は後述)。このため、64 ビット版のワーカプロセスを利用して Web アプリケーションを動作させた場合には、64 ビット動作することになります

image

このように、Web アプリケーションの場合には、Web アプリ側で 32/64 ビット指定をするのではなく、ワーカプロセス側の方でビット切り替えを行う必要がある、ということを押さえておいてください。

では、ワーカプロセスのビットを切り替えるためには....と進めたいところですが、その前に Visual Studio 2008 のビルド構成についても解説しておきます。

[Step. 12] Web サイトプロジェクトを含むソリューションのビルド構成設定

ASP.NET Web サイトプロジェクトを含むソリューションの場合には、ビルド構成に "Mixed Platform" や ".NET" という、見慣れない構成が出現しますが、これは以下のようなものです。

image

まず、コンソールアプリケーションや Windows アプリケーションのように、開発時に完全なコンパイルが行われるソリューションの場合には、コンパイル時のプラットフォームフラグとして、"Any CPU", "x86", "x64" などを指定することができます。その結果として、アプリケーションのビルド時に、動作プラットフォームを完全に決定することができます。

image

しかしながら、Web サイトプロジェクトの場合、前述したように、開発時に実行プラットフォームを決定することができません。このため、

  • Web サイトプロジェクトでは、プラットフォームが指定できず、常に ".NET" となる。
  • ビルド時に動作プラットフォームを完全指定することができないので、ソリューション全体のビルド構成名としては、"Mixed Platform" という特殊な名前が付与される。

となっています。

image

[Step. 13] IIS 6 のワーカプロセスの動作ビットモードの変更方法

では、引き続きワーカプロセスの動作ビットモードの変更方法を解説します。動作ビットモードの変更方法は、IIS 6, 7 の場合でそれぞれ異なります。

まず、IIS 6 (Windows Server 2003 x64 版)の場合には、以下の 3 つの作業により 64/32 ビットの切り替えができます。

  • メタベースの W3SVC/AppPools/enable32BitAppOnWin64 を変更する。
    32 ビット版の w3wp.exe と 64 ビット版の w3wp.exe のどちらを使うのかを指定します。
  • ISAPI 拡張子の登録を変更する。
    32 ビット版の aspnet_isapi.dll と 64 ビット版の aspnet_isapi.dll は個別に存在しているため、これを aspnet_regiis.exe ツールで切り替えます。
  • IIS サービスマネージャから ISAPI 拡張の動作許可を与える。
    ASP.NET 2.0 の動作許可は、32/64 ビット個別に存在するため、こちらも個別に指定します。
 ■ 32 ビットモードに変更する場合
 C:\>cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1
 C:\>%SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i
 ※ 最後に IIS サービスマネージャから ASP.NET v2.0.50727 (32-bit) の動作許可を与える
  
 ■ 64 ビットモードに変更する場合
 C:\>cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 0
 C:\>%SYSTEMROOT%\Microsoft.NET\Framework64\v2.0.50727\aspnet_regiis.exe -i
 ※ 最後に IIS サービスマネージャから ASP.NET v2.0.50727 の動作許可を与える

image

なお、設定に際して注意すべきこととして、IIS 6 では 64/32 ビット切り替えがサーバ全体でしかできない、という点があります。つまり、当該サーバ内に32 ビット動作を必要とする Web アプリケーションが一つでも存在する場合には、64 ビットモードに切り替えることができない、ということになります。

実はこの制限事項は非常に厳しいもので、たとえば前述した Jet OLE DB や、Oracle (MSDAORA)、ASP.NET 1.1、VB 6 ランタイム(または VB 6 で開発した COM など)はすべて 32 ビット動作が必要です。このため、サーバ内にこれらのアプリがひとつでも存在する場合には、64 ビット切り替えはできない、ということになります。(これについては後述します。)

[Step. 14] IIS 7 のワーカプロセスの動作ビットモードの変更方法

しかし IIS 7 の場合には、アプリケーションプール単位に 32 ビット/64 ビット切り替えができるので、サーバ内に 32 ビットアプリと 64 ビットアプリを共存させることが可能になります。具体的には、アプリケーションプールの「32 ビットアプリケーションの有効化」フラグを True に変えることにより、32 ビット版の w3wp.exe が利用されるようになります。

image

ちなみに、スクリプトによる変更も可能です。

 ■ 32 ビットモードに変更する場合
 C:\>appcmd apppool set /apppool.name:AppPool#1 /enable32BitAppOnWin64:true
  
 ■ 64 ビットモードに変更する場合
 C:\>appcmd apppool set /apppool.name:AppPool#1 /enable32BitAppOnWin64:false

[Step. 15] 64 ビットワーカプロセスの制限事項

さて、ここまでの解説からわかるように、64 ビット版の w3wp.exe を使う場合には、以下の制限が発生します。

  • 64 ビット版の ISAPI 拡張しか使えない。
  • 64 ビット版の ISAPI フィルタしか使えない。
  • 64 ビット版のバイナリコードしか使えない。

このため、特に 32 ビットの既存アプリケーションを 64 ビットネイティブで動作させたいと思う場合には、ドライバの提供有無などについて確認する必要があります。マイクロソフトから提供されているランタイムの多くは 64 ビット・32 ビット版の両方が提供されていますが、すべてというわけではありません。また、サードパーティ製の製品の場合には、32 ビット版しか提供されていないことがしばしばあります。アプリケーションランタイムやドライバ類のすべてが 64 ビット対応していない限り、64 ビットネイティブでの動作はできない、という当たり前の点に注意してください。

MS 製品の中で、x86, x64 版のどれが提供されているのかのリストがわかりやすくまとまっていればよいのですが、なかなかいいリストがないのでさくっと作ってみるとこんな感じです。古いアプリで特にひっかかりやすいのが、ASP (Active Server Pages)そのものは 64 ビットランタイムがあるけど VB6 ランタイムには 64 ビットランタイムがない、という点です。OLE DB ドライバなどもドライバにより対応状況が違うので、十分注意するようにしてください。

image

[Step. 16] 開発環境において 64 ビットワーカプロセスを使いたい場合について

最後に、x64 Windows 上の開発環境で 64 ビットワーカプロセスを使いたい場合について解説しておきます。

64 ビットネイティブで動作する ASP.NET アプリケーションを作ろうと思ったとしても、Visual Studio 2008 上から Web サイトプロジェクトを実行する限り、ASP.NET 開発サーバ(← x86 版しかない)が利用されるため、32 ビットでしかアプリケーションを動作させられません。もし開発時から Web アプリを 64 ビットで動作・デバッグしたいのであれば、以下のような作業を行う必要があります。

  • x64 版 Windows OS (Vista が便利)を使う。
  • IIS 7 を使う。
  • ファイルシステム型開発ではなく、IIS 型開発を行う。

image

このようにすると、開発時から 64 ビットネイティブでの動作・デバッグが可能になります。参考までに概念図を以下に示しておきますが、Visual Studio 2008 では 64 ビットデバッグが可能になったため、VS2008 自体が 32 ビット動作していても、64 ビットで動作するアプリケーションを直接デバッグすることができます。

image

[本エントリのまとめ]

以上の解説をまとめると、次のようになります。

  • ASP.NET Web アプリケーションの実行モードは、アプリケーション側では決定できません。ワーカプロセスの動作モードにより、32 or 64 ビットどちらで動作するのかが決まります。
  • ASP.NET 開発サーバ(WebDev.WebServer.exe)は、x86 版しか存在しません。よって、常に 32 ビット動作になります。
  • IIS 6, 7 のワーカプロセス(w3wp.exe)は、x86 版と x64 版が存在します。このため、構成設定により、32 ビット動作と 64 ビット動作を切り替えることができます。
  • IIS 6 の場合には、サーバ全体でしか 32/64 ビット切り替えができません。IIS 7 の場合には、アプリケーションプール単位に、32/64 ビット切り替えができます。

[まとめ]

というわけで、全 3 回にわたって .NET アプリケーションの 64 ビット対応について解説してきましたが、.NET アプリケーションの場合には、MSIL と呼ばれる中間言語が絡むため、32/64 ビット両対応が可能なバイナリを作れる半面、動作がやや複雑になります。一度理解してしまえばそんなに難しい話ではないのですが、この機会にぜひ 64 ビット対応可能な .NET アプリの作り方も理解していただければと思います。