.Netで作ったアプリをWindows7 64ビットで動作させる

Posted on :| コメント (0) | トラックバック (0)

吉田はおもに競馬とFXのソフトを作っています。Windowsプラットフォーム向けなので、OSのバージョンの影響を受けるのですが、最近まわりでもWindows7 64ビットのインストールされたPCが多くなってきました。
そこで、拙作競馬ソフトの「シンドローム2」を64ビット環境で動くようにしたので、その顛末を書きたいと思います。

■64ビット版 Windowsに内蔵されているWOW64という互換機能

WOW64とは、64ビット版 Windows XP、Windows Vista、Windows7に内蔵されている機能のことです。Windows On Windows64の略らしいのですが、エミュレータによって32ビットのWindowsアプリケーションを動作させる仕組みです。

しかし、このWOW64は欠陥があります。

(1) 32ビットアプリから64ビットDLLを呼べない
(2) 64ビットアプリから32ビットDLLを呼べない

それぞれにあったDLLやOCXを用意すればよいのですが、DLLやOCXはライブラリとして提供されているため、それを呼び出すアプリケーション側に制約がつくのです。当然、サードパーティが提供しているライブラリの中には、32ビット版しか用意されてないものもあります。

Windows7 64ビット版でInternet Explorerが32ビット版と64ビット版の両方がインストールされている最大の理由は、WOW64の欠陥によるものなのです
たとえば、SleipnirやLunaScapeといったタブブラウザは、IEコンポーネントを利用します。シンプルぱっと2もIEコンポーネントを利用します。IEコンポーネントは利用しているソフトも多く、64ビット版しかインストールされていないと、当然32ビットアプリであるシンプルぱっと2は、64ビットIEコンポーネントを扱えないため、Windows7 64ビット上では動作しなくなります。

こういう事態を想定したマイクロソフトの次善の策と解釈すべきです。

■.Net Framework 2.0アプリをWindows7 64ビットに対応させる

シンドローム2は、.Net Framework 2.0上で動作します。作成したのはVB2005ですが、.Net上で動くソフトは、CLRとよばれる共通言語ランタイムにより管理されるマネージドコードです。

結論から言うと、マネージドコードで作成されたアプリ(VB、C#)は、何の変更も無しにWindows7 64ビットで動作します。これは、64ビット版の.Net Frameworkが自動的に32ビット、64ビットに置きかえて実行するためであり、作り手側は特に意識する必要がないといえます。ただし、マイクロソフトから出ているガイドラインは目を通しておく必要があります。

ここで勘違いがありました。64ビットのマネージドコードを生成するには、64ビットの.Net Framework上でないと駄目だと誤った情報を仕入れてしまったためです。
このことが、対応を後手後手におくらせた原因なのですが、結局確認のために64ビットWindows7が必要なことには代わりありません(いまは借り物のPCで確認してます)。

シンドロームに話を戻します。シンドローム2は本体プログラムの他に、データベースであるSQL Server2005 Express、JRA-VANが提供しているJV-Link(ActiveX.DLL)に依存しています。
SQL Server2005 Expressは、64ビット版と32ビット版が用意されています。Windows7 64ビットにインストールするには、64ビット版を入れる必要があります。これは問題ありません。

もうひとつは、JRA-VANのJV-Linkです。JRA-VANは、JV-Linkが32ビットと64ビット両方に対応していますと書いています。しかし、提供しているのは32ビットコンポーネントです。これがくせ者でした。WOW64の制約で、64ビットアプリケーションから、32ビットDLL、OCXは呼び出せません。JV-Linkの表現が曖昧なため、両方のバージョンが用意されていて、インストーラで切り分けているようにも取れました。
しかし、これはWOW64の事を指していたのです。

マネージドコードであるシンドローム2はWindows 7 64ビットに持って行くと、64ビットアプリケーションとして動作します。SQLも64ビット。これは問題がありません。
しかし、JV-Linkは32ビットなのでアクセス出来なくなります。

■解決策は?

VS2005には、構成マネージャというものがあります。ここでは、プラットフォームを選択できますが、通常は「Any CPU」となっています。これを、「x86」に変更すると強制的に32ビットアプリケーションとしてコンパイルできるようになります。

Vs2005

こうすることで、64ビット版.Net Framework上でも強制的に32ビットアプリケーションとして動作するようになります。WOW64のお世話にはなりますが、32ビットコンポーネントであるJV-Linkをハンドル出来るようになりました。

今回の件は、WOW64の制約、マネージドコードの64ビット/32ビットの自動切り替えによって、結構振り回されました。同じような経験をされている人もいるかもしれないので、備忘録として残しておきます。

トラックバック

このエントリーのトラックバックURL:

コメント

コメントフォームに記入し投稿してください





Search
最近の記事
カテゴリー
過去の記事
Comments
TrackBacks
Feed
Powered by