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 アプリの作り方も理解していただければと思います。

    Comments (6)

    1. yakken says:

      この手の日本語の話題や記事がみあたらなかったので、非常にうれしいです。

      まだ1.1のアプリが残っているけど、外注製なので2.0にあげるわけにもいかない、けどサーバは新しくなる。さてどうしよう?とか、開発メンバにこのあたりのことをどうやって説明しようとか、COMを絡めた場合とか、x64の場合って考えることが多くて、このようにまとまっている記事は本当にありがたいです。

    2. t98907 says:

      すっごくためになりました。

      visual studio 2003で開発させられていて

      64bit版windows server 2008のiis7上で

      com経由でexcelやらwordを操作しなくちゃいけなくて

      はまっていたので、asp.net 1.1 webアプリを

      修正するに当たって、visual studioのバージョンや設定などの環境を

      どう更新していけばいいのかに興味があったので。

    3. nakama says:

      yakken さん、t98907 さん、書き込みありがとうございます。

      やっぱり 64bit の話は結構ニーズがあるみたいですね。役に立ったのであれば幸いです。

      (実はこの blog で、現在のところ一番ヒット数があるのがこの 64bit の記事です….)

    4. ug says:

      とてもわかり易い説明ありがとうござます。

      1つ質問なのですが、VisualStudio2005でWeb アプリを 64 ビットで動作・デバッグすることはできないのでしょうか?

      というのも、開発中のWEBアプリを64bit化するために、サイトの参照設定にある「Oracle.DataAccess.dll」を64bit版に置き換えたところビルドエラーとなってしまいました。これは、ASP.NET開発サーバーが32bitとして起動しているからだと思います(32bit版同DLLでは正常完了)。

      2008にしてIIS7.0にすればできそうですが、現環境(↓)でビルドすることは不可能なのでしょうか?

      —ビルド環境—

      Windows Server2003 R2 EnterPrise x64 edition

      VisualStudio2005 Ver2 Sp1

      IIS 6.0(ASP2.0)

      IIS型開発

    5. nakama says:

      ug さん、こんにちは。

      > 1つ質問なのですが、VisualStudio2005でWeb アプリを 64 ビットで動作・デバッグすることはできないのでしょうか?

      すみません、私自身は経験がないので確実なお答えができないのですが、内容を拝見している限り、これは VS2005 の問題ではないように思います。

      > というのも、開発中のWEBアプリを64bit化するために、サイトの参照設定にある「Oracle.DataAccess.dll」を64bit版に置き換えたところビルドエラーとなってしまいました。これは、ASP.NET開発サーバーが32bitとして起動しているからだと思います(32bit版同DLLでは正常完了)。

      Oracle.DataAccess.dll は ODP.NET のライブラリのようですが、64 ビット、32 ビットのバイナリが別々に存在している、ということなのでしょうか? 直感的には、以下の 2 つで解決できそうな気がするのですが。

      ・IIS 6.0 上にアプリケーションを乗せた状態で VS で開発を行う(=ファイルシステム型開発ではなくローカル IIS 型開発を使う)

      ・IIS 6.0 を 64 ビットモードで動かすように設定する(← 既定だと 64 ビットだと思いますが)

      環境もないのであてずっぽうの回答で申し訳ありませんが;。

      あとは、32 ビット環境で開発・デバッグを行っておいて、テストや運用時だけ 64 ビット環境にする、というのも一手かもしれません。

    6. mino says:

      asp.net 開発サーバーは最新のVisual Studioでは64bit対応しているようです。

      http://xin9le.net/articles/183

    Skip to main content