none
Windows Server 2003 64-bit バージョン対応のアプリケーション開発 RRS feed

  • 質問

  • いつもお世話になっております。ユクヒロです。

    Windows Server 2003 64-bit バージョン対応のアプリケーション開発を行う案件が発生しました。

    VS2005で開発を行いたいと思っているのですが、64bit対応のアプリケーション開発は可能なのでしょうか?これまでもVSシリーズでの開発がメインでしたが特に32bitを意識することなく開発してきました。VS2005で64bit開発を行うためには、何か設定なであるのでしょうか?

    また、64bit開発における32bit開発時との相違点や注意するべき事項などあるのでしょうか?

    アドバス方、よろしくお願いいたします。

     

    2006年4月26日 14:12

すべての返信

  • Windowsアプリやコンソールアプリ、.NET完結型で行う場合には問題ありません。

    ただしJ#を混ぜて利用する場合には32bit(WOW)で起動させる必要があります。

    問題点はCOMと、P/INVOKEの局面で発生します。

    COMは64bitモードの時には64bitCOMしか利用出来ませんし、32bit~~以下略

    P/INVOKEは適切な利用をしている場合には問題が発生しません。

    問題が発生するとしたら主にIntPtr周辺です。ポインタを不適切にintでやり取りしていたりすると問題が発生します。

    IISを絡ませる場合にはIISを32bit or 64bitで起動させる判断をする必要があります。

    こんなところでしょうか。

    2006年4月26日 15:04
  • じゃぁ私のほうは、そのほかの注意点を(^^;

    Managed/Unmanaged で共通する注意点は、64bit 版として動作している場合は、プロセス内の全ての実行コードが64bitである必要があることです。

    特にサードパーティ製のUnmanagedなモジュールを利用している場合は注意が必要です。

    Unmanaged(C++)の場合は、x64 用がProから、IA64 は MSDN に加入するか、TeamEdition にするかとなっていると思います(Managed Only なら Express からOK)。

    それと、インストーラ(msi)は、x86/x64/IA64 で全て別々の物になります。

    また、msi 以外のオリジナルエンジンを持つインストーラは殆どが 64bit 対応されていません。

    64bit 対応はおそらくインストーラが一番面倒な事例になると思いますので、その点は注意が必要でしょう。

    VSセットアップ以外のインストーラ作成ツールを使う場合は、あらかじめある程度見積もりたてておかないと、かなりはまることになりかねませんのでご注意を。

     

    2006年4月27日 2:35
  • 中様、とっちゃん様、適切なアドバイスをありがとうございました。

    今回の開発案件がWEBアプリケーションであることをお伝えすることを失念しておりました。WEBアプリケーションであることを前提に再質問をさせて頂きます。


    IISを絡ませる場合にはIISを32bit or 64bitで起動させる判断をする必要があります。


    中様、上記の「判断をする必要がある」とは、どういう意味になるのでしょうか?

    今回の案件では、WindowsServer2003/64bitを使用しますので、付属のIIS6.0もデフォルトでは64bitで動作するものと思っております。もう少し詳細なお話をお聞かせ願えないでしょうか?


    特にサードパーティ製のUnmanagedなモジュールを利用している場合は注意が必要です。Unmanaged(C++)の場合は、x64 用がProから、IA64 は MSDN に加入するか、TeamEdition にするかとなっていると思います(Managed Only なら Express からOK)。


    とっちゃん様、64bit対応のサードパーティ製品(Unmanagedモジュール)をVS2005に組み込んで(参照設定して)使用する場合、VS2005の利用バージョンに注意が必要とのことでしょうか?例えば、間違えてExpressでUnmanagedモジュールを参照設定しようとしても出来ないという事でしょうか?

    アドバイス頂いた内容以外での新しい疑問なのですが、開発環境も当然WindowsXP/64bitにする必要がありますでしょうか?VS2005上に対応する環境設定(32bit or 64bit)がないとすれば、開発環境に依存するのでしょうか?WindowsXP/64bitで開発したアプリケーションは、64bit環境限定なアプリケーションとなる???

    以上、よろしくお願いいたします。なお、有益な情報サイトがありましたら、お教え願います。

     

    2006年4月27日 13:45
  • >>IISを絡ませる場合にはIISを32bit or 64bitで起動させる判断をする必要があります。
    >中様、上記の「判断をする必要がある」とは、どういう意味になるのでしょうか?

    やっぱりWebかぁ

    IISを64bitモードで動かすと、32bitモードは混在できなくなります。

    .NET1.xとの混在や、もろもろのISAPIフィルタも含めて64bitである必要が出てきます。

    .NET1.xとの混在とは、Webアプリケーションの混在も含めて意味しています。プロジェクトが違うというのは何の気休めにもなりません。

    このへんはきちんと環境を用意して確認してください。ただManagedにつくるとなれば問題ないので一線を越えなければいいわけです。(^^

    開発環境ですが、もちろん1台は必須でしょう。ただそれは確認する。作りながら理解する。そういういみでです。

    Any CPUのManagedなアセンブリはx86, x64, IA64でも動きます。

    2006年4月27日 13:57
  •  ユクヒロ さんからの引用

    64bit対応のサードパーティ製品(Unmanagedモジュール)をVS2005に組み込んで(参照設定して)使用する場合、VS2005の利用バージョンに注意が必要とのことでしょうか?例えば、間違えてExpressでUnmanagedモジュールを参照設定しようとしても出来ないという事でしょうか?

    いえ。参照したいプロジェクト(Webアプリですね)が作れれば、参照は可能です。

    Express で制限がかかっているのは、IDE そのものの拡張性です。

    全く出来ないわけではありませんが、かなりの部分に制限が課せられています(だからこそ無償で配布できているともいえるのですが)。

    アドバイス頂いた内容以外での新しい疑問なのですが、開発環境も当然WindowsXP/64bitにする必要がありますでしょうか?VS2005上に対応する環境設定(32bit or 64bit)がないとすれば、開発環境に依存するのでしょうか?WindowsXP/64bitで開発したアプリケーションは、64bit環境限定なアプリケーションとなる???

    開発環境と実行環境は必ずしも同じである必要はありません(そんなことになったら、市販アプリは開発できないですw)。

    ただし、動作させるためには、別途 64bit な環境は必須となります(32bitOSで開発する場合)。

    特に、Webアプリの場合は、本番環境で実験するというわけにはいきませんので専用のテストマシンを用意することになると思います。

     

    2006年4月28日 3:04
  • オフトピック気味ですが…。

    開発環境と実行環境は同一にしない方が望ましいですよね。いや、たまにあるんですよ、デバッグ環境でしか動かない物を作られてしまって、開発兼実行環境でまともに動いているので気づくのが遅れたという話が…orz。

     

    2006年4月28日 9:07
  •  KKamegawa さんからの引用

    オフトピック気味ですが…。

    開発環境と実行環境は同一にしない方が望ましいですよね。いや、たまにあるんですよ、デバッグ環境でしか動かない物を作られてしまって、開発兼実行環境でまともに動いているので気づくのが遅れたという話が…orz。

    OSの種類はあわせてあるほうがいいんですけどね。<開発環境と実行環境

    ハードウェアとして同一のものというのは、原則NGというか、そんなの実行環境とは呼ばないですから(^^;

    趣味でソフト開発であっても、絶対と呼べるくらいテスト用のマシンは用意すべきですね。
    Virtual Server という財布にやさしいのもありまので(^^;

    2006年4月28日 10:36
  • 皆様、アドバイスありがとうございます。

    少し理解出来てきたつもりが、やはり”つもり”だったようでう、また迷ってます。


    IISを64bitモードで動かすと、32bitモードは混在できなくなります。.NET1.xとの混在や、もろもろのISAPIフィルタも含めて64bitである必要が出てきます。


    IIS6.0を64bitモードで動作させた場合、.NET1.xは混在できないとありますが、なぜなんだろうか???

    ISAPIフィルタも含め64bitである必要があるとは、どういうことなんだろうか?

    アプリケーションを作成するにあたり、このアプリケーションは64bit対応アプリケーションですよ・・・という設定がないのであれば、.net1.xやISAPIフィルタもIIS6.0/64bit動作モード上で実行出来るのではないのでしょうか?

    もしかして、VS2005(.net2.0)からでないと、64bit対応アプリケーションが作成出来ないということなのだろうか?VS2003以前で作成したアプリケーションは、32bit環境でしか動作しない???ということかな???

    ちょっと困惑してきました。

    2006年4月28日 15:54
  • >IIS6.0を64bitモードで動作させた場合、.NET1.xは混在できないとありますが、なぜなんだろうか???

    .NET 1.xは32bitアプリケーションだからです。

    >ISAPIフィルタも含め64bitである必要があるとは、どういうことなんだろうか?

    64bitプロセスは64bitコンポーネントしか使えないから

    >アプリケーションを作成するにあたり、このアプリケーションは64bit対応アプリケーションですよ・・・という設定がないのであれば、.net1.xやISAPIフィルタもIIS6.0/64bit動作モード上で実行出来るのではないのでしょうか?

    出来ません。

    というか対応ですよと無いものは現時点では32bitしか意識されていないというのが現実です。

    >もしかして、VS2005(.net2.0)からでないと、64bit対応アプリケーションが作成出来ないということなのだろうか?

    そうです。

    >VS2003以前で作成したアプリケーションは、32bit環境でしか動作しない???ということかな???

    WOWで動きます。

    64bit Windows上の32bitエミュレーション環境と思ってもいいかもしれません。

    とりあえず、最近は安いので1台調達して遊んでみることです。

    2006年4月28日 20:29
  •  中博俊 さんからの引用
    >IIS6.0を64bitモードで動作させた場合、.NET1.xは混在できないとありますが、なぜなんだろうか???

    .NET 1.xは32bitアプリケーションだからです。

    こう書くから混乱するのでは?

    .NET アセンブリは実行バイナリと中間コードの混合物で、中間コードはランタイムが各プラットフォーム向けに実行時コンパイルや評価を行います。
    Microsoft 提供の実行環境としては、CLR が存在します。

    CLR は独自機能として、いわゆるネイティブアプリケーションに組み込むライブラリとしても動作するようになっており、既存のネイティブアプリケーションに .NET アセンブリの実行機能を追加するために使うことができます。
    IIS や SQL Server 2005 などはこの仕組みを利用して、ネイティブアプリケーションとして開発されてきた各製品に .NET サポートを追加しています。

    しかし CLR 1.x は 32bit モードのものしかありません。
    よって一旦 64bit プロセスとして起動されたネイティブアプリケーションには CLR 1.x を読み込むことはできません。
    IIS に限らず、SQL Server や Internet Explorer 全てそうです。

    一方 CLR 2.0 は 32bit モード用のものと 64bit モード用のものがあるので、ネイティブアプリケーションの起動条件に応じて対応するものを読み込むことができます。

    そして CLR 2.0 は条件付きで .NET 1.x のアセンブリも読み込むことができるので、Visual C# .NET 2003 で作られた .NET アセンブリを 64bit モードで動かすことは不可能ではないということにもなります。
    64bit プロセス中に 32bit 実行ランタイムは混在させられませんが、抽象度の高い中間コードであれば最終処理がまだなので、64bit プロセス中に「.NET1.xの成果物」は混在させられる可能性があります。

    とまあ登場する要素が多いので、「~はできますか?」の Yes/No を知るだけでは全体像はなかなかつかめてこないと思いますよ。
    # かえって混乱したりして
    周囲にこの結果を伝えるときにも気をつけて下さい。> ユクヒロさん

    実際、この手の掲示板でも「正確に答えることでかえって混乱させてしまいそう」と思われた場合は、「出来ないと思ってください」と回答されることもあると思っておいた方がよいかもしれませんね。

    2006年4月29日 6:23
  •  中博俊 さんからの引用

    .NET 1.xは32bitアプリケーションだからです。

    WOWで動きます。64bit Windows上の32bitエミュレーション環境と思ってもいいかもしれません。

    wowの存在は、投稿前の調査で、存在を認識しており、既存32bitアプリケーションがx64上でもwow環境内で動作する、と理解しております。

     NyaRuRu さんからの引用

    しかし CLR 1.x は 32bit モードのものしかありません。
    一方 CLR 2.0 は 32bit モード用のものと 64bit モード用のものがあるので、ネイティブアプリケーションの起動条件に応じて対応するものを読み込むことができます。

    「32bit モード用のものと 64bit モード用のものがある」とありますが、ここがどうしても理解できていません。CLR2.0開発環境で例えれば、32bitモード用はVS2003(.net1.x)でビルドしたもので、64bitモード用はVS2005(.net2.0)でビルドしたものと理解すれば良いのでしょうか?実行時にアプリケーション自らが「私はxxモード対応ですよぉ」と宣言するわけではないと思うので、違うとすれば開発環境なのかと思う次第です。

    ご指摘頂いたとおり、複数の構成要素を正しく認識できていないために、困惑しています。前提となる知識もかなり不足していると認識できました。この知識不足のため、皆様がアドバイスしていただいた事柄を、理解できない状態でいるのだと思います。

    これ以上は、なんで?なぜ?が続きそうですので、私自身、もっと知識を身に付けた上で、それでも疑問に感じる部分について、具体的に再質問したいと思います。

    アドバイスを頂いた皆様、大変感謝しております。ありがとうございました。また、ここで意見交換出来ることを楽しみにしています。

     

     

    2006年5月1日 10:41
  • >「32bit モード用のものと 64bit モード用のものがある」とありますが、ここがどうしても理解できていません。CLR2.0開発環境で例えれば、32bitモード用はVS2003(.net1.x)でビルドしたもので、64bitモード用はVS2005(.net2.0)でビルドしたものと理解すれば良いのでしょうか?

    うーん

    やはり根本的にはx64マシンで遊ぶしかっていう感じですね。

    CLR1.0  x86
    CLR1.1  x86
    CLR2.0  x86, x64, IA64

    まず対応プラットフォームはこういうかんじです。

    >実行時にアプリケーション自らが「私はxxモード対応ですよぉ」と宣言するわけではないと思うので、違うとすれば開発環境なのかと思う次第です。

    いえそうです。

    PEヘッダに入っています。

    それにあわせた適切なCLRをローダが起動してくれます。

    2006年5月1日 11:45
  • とっちゃんです。

     ユクヒロ さんからの引用

    実行時にアプリケーション自らが「私はxxモード対応ですよぉ」と宣言するわけではないと思うので

    いえ。中さんも書いていますが、EXE自身が私はxxモード対応ですよぉと宣言しています。

    詳しくはビルドオプションのページのヘルプに出てると思いますが、
    2.0 からは、CLRですよ~のほかに、x86(32bit), x64(64bit), IA64(64bit) のいずれかか、
    Any CPU(上記3つのどれでも動く)で動かせますよ~と「明記」するようになっています。

    なので、OS(ローダー)はここの部分を見て、どのモードで動かすか(もしくは、今の環境では動かせないか)を判断します。

    2006年5月1日 14:02