locked
IISの.NETframework Version設定について RRS feed

  • 質問

  • お世話になっております。

    標題の件について何か情報をお持ちの方がいればご教授下さい。

    IISの.NETframework Version設定を4.0としたアプリケーションプール内で

    異なる.NETframework Versionで作成したモジュール(dll)を動作させた場合、

    各モジュールはどのVersionで実行・動作するのでしょうか?

    個人的には以下のようになると思っています。

    ・.NETframework2.0で作成したモジュール(DLL) = 2.0で動作

    ・.NETframework3.0で作成したモジュール(DLL) = 3.0で動作

    ・.NETframework4.0で作成したモジュール(DLL) = 4.0で動作 

    IISの.NETframework4.0のアプリケーションプール内で

    各.NETframework Versionでモジュールが動作しているイメージです。

    (下位互換により動作している?)

    ※何か参考になるMSDNサイトがあれば教えて頂きたいです。

    ※その他に判断や回答に必要な情報があれば、追記致します。

    2012年2月22日 2:32

回答

  • おおよそ互換そのものはあります。

    しかし例えば、バージョンが上がるにつれスレッド処理が改善されています。従来、並列実行されなかったものが4.0では並列実行されるものもあります。その際、古いコードで並列実行に対する同期処理がなされていない・甘いなどの問題があると、4.0で顕在化することがあり得ます。こういった場合、4.0でのみエラーになるわけですが、4.0の非互換と言いますか? 単に元からあったコードのバグと言うべきでしょう。

    そういった部分が多数あるので「互換があるから必ず動く」とは言えません。

    2012年2月29日 2:01

すべての返信

  • こんにちは。

    ASP.NET の side-by-side 実行の概要 http://msdn.microsoft.com/ja-jp/library/a99txfy5.aspx

    で、どうでしょう。

    2012年2月23日 0:49
  • 提示されたリンク先には

    同じプロセス (アプリケーション プール) で、複数のバージョンの CLR を実行することはできません。 インプロセスの side-by-side 実行は、.NET Framework 4 ではサポートされていますが、ASP.NET では使用できません。

    とありますから、「IISの.NETframework Version設定を4.0としたアプリケーションプール内」であれば、全て4.0で動作することになります。

    2012年2月23日 1:14
  • Keiichi Oumi様、佐祐理様返信ありがとうございます。

    自分の予想とは違っていたので、驚いています。

    追加で質問させて頂きたいのですが、
    ①ターゲット フレームワークを指定した場合でも
     アプリケーションプールで指定したバージョンで動作するのでしょうか?
     (コンパイルversionの指定なので関係ないと思いますが・・・。)
     
     IISの.NETframework Version設定:4.0
     モジュールの設定                           :<TargetFrameworkVersion>v3.0</TargetFrameworkVersion>
     動作するversion                           :??
      
      ※MSBuild のマルチ ターゲット
        http://msdn.microsoft.com/ja-jp/library/ee395432.aspx

    ②IISの.NETframework Version設定を4.0としたアプリケーションプールで
      Version3.5のモジュールを動作させた際のエラーはVersion非互換エラーの認識で良いのでしょうか?
     
      ※前提として、IISの.NETframework Version設定を3.5としたアプリケーションプールでの動作時にエラーは無し。
     


    2012年2月23日 2:04
  • コンパイルの話になってきたので、ASP.NETからいったん離れた説明をします。

    .NET Frameworkではコンパイル時に参照するライタイムバージョンと実行時に利用するランタイムバージョンを別のものにすることができます。もちろん通常は一致させますが。コンパイル時に指定するバージョンについては質問者さんの挙げられた設定などになります。実行時に利用するランタイムバージョンはapp.configの<supportedRuntime> 要素で指定します。

    こういった背景がありますから、ASP.NETにおいては、コンパイルに使用したランタイムバージョンに依らずにアプリケーションプールの動作バージョンで決まるわけです。さきほど引用しそびれましたが、Keiichi Oumiさんの挙げられたリンク先には

    Web アプリケーションが実行される CLR のバージョンは、アプリケーション プール (または IIS 6.0 のスクリプトマップ) によって決定されます。 構成ファイルの supportedRuntime 要素と requiredRuntime 要素は、ASP.NET アプリケーションには適用されません。

    という記述があるのはこの意味です。

    さて、エラーについてはエラーの内容を見てみないことにはわかりません。

    2012年2月23日 2:19
  • 佐祐理様、返信ありがとうございます。

    説明が分かりやすく、とても助かります!

    >さて、エラーについてはエラーの内容を見てみないことにはわかりません。

    たしかにエラーの内容によると思いますが、IISの.NETframework Version設定を3.5(2.0)から4.0に変更するのみで

    エラーが出るのならばVersion非互換と思うのですが、このような場合でも非互換ではないエラーというのは出るものなのでしょうか?

    実際にWeb.configの定義エラー(継承関係)やログ関連のエラーが出ていた記憶があります。。。

    2012年2月23日 4:32
  • こんにちは

    さて、エラーについてはエラーの内容を見てみないことにはわかりません。

    を踏まえて…

    たしかにエラーの内容によると思いますが、IISの.NETframework Version設定を3.5(2.0)から4.0に変更するのみでエラーが出るのならばVersion非互換と思うのですが、

    非互換と思います。(ちなみに、Application Pool は、2.0 or 4.0のみ選択可能です。)

    このような場合でも非互換ではないエラーというのは出るものなのでしょうか?

    非互換によるエラーではないとすれば、開発したアプリケーションのバグとなるでしょうか…

    実際にWeb.configの定義エラー(継承関係)やログ関連のエラーが出ていた記憶があります。。。

    構成ファイルのスキーマが変わったことによる非互換に起因するエラーですね。

    質問の意図が不明瞭になっていると思います.もう少し具体的に何を心配されているのか、明らかになりませんか?

    以下参考までに。

    方法: 同じサーバーで異なるバージョンの .NET Framework を使用する Web アプリケーションをホストする http://msdn.microsoft.com/ja-jp/library/dd329554.aspx
    ASP.NET 4 Breaking Changes http://www.asp.net/whitepapers/aspnet4/breaking-changes


    • 編集済み Keiichi Oumi 2012年2月28日 1:17 綴り訂正
    2012年2月28日 1:17
  • Keiichi Oumi様、返信ありがとうございます。

    質問させて頂いた経緯としては、

    「複数のVersionで作成・ビルドされたDLL(VB.NET)は、IIS上ではどのVersionで動作しているのか?」を、

    仕事の依頼元の人から聞かれた際に明確な回答な出せなかったので、調査がてらここで質問させて頂きました。

    心配している点としては、4.0より古いVesionで作成・ビルドされたDLLを4.0の(IIS)アプリケーションプールで

    動作させた際にVersion非互換等の不具合が出るのか?もしくは、下位互換があるので問題なく動くのか?かを

    心配しています。

    加えて、IISを利用しない環境で複数のVersionで作成・ビルドされたDLL(VB.NET)を動作させた場合の

    動作Versionについても調査しています。(例えば、WindowsサービスでDLLを動作させている環境など)

    紹介して頂いたサイト参照させて頂きます!

    2012年2月29日 0:24
  • おおよそ互換そのものはあります。

    しかし例えば、バージョンが上がるにつれスレッド処理が改善されています。従来、並列実行されなかったものが4.0では並列実行されるものもあります。その際、古いコードで並列実行に対する同期処理がなされていない・甘いなどの問題があると、4.0で顕在化することがあり得ます。こういった場合、4.0でのみエラーになるわけですが、4.0の非互換と言いますか? 単に元からあったコードのバグと言うべきでしょう。

    そういった部分が多数あるので「互換があるから必ず動く」とは言えません。

    2012年2月29日 2:01
  • そういった部分が多数あるので「互換があるから必ず動く」とは言えません。

    そうなんですよねー(><)

    あと、蛇足になるかもしれませんが。(っていうか蛇足?)

    .NET Frameworkのバージョンを変更するとすれば、IIS,AppPool のバージョンの組み合わせによって、リクエストの制限方法も変わってくるので注意が必要な場合があります。

    .NET Framework Version IIS Version Server OS
    2.0 IIS 7.0 Windows Server 2008
    3.5 SP1 以上 IIS 7.0 Windows Server 2008
    IIS 7.5 Windows Server 2008 R2

    といった組み合わせごとに、要求数を制限する方法が異なります。詳しくは、以下をどうぞ。

    ASP.NET Thread Usage on IIS 7.5, IIS 7.0, and IIS 6.0
    IIS 7 での ASP.NET 2.0 の互換性に影響する変更点
    <configuration> 要素
    2012年3月2日 1:03
  • 佐祐理様、返信ありがとうございます!

    返信が遅くなってしまい申し訳ありません。

    教えて頂いた情報をもとに確認・調査してみます!

    不明点や疑問点がありましたら、また質問させて頂くと思いますが、

    どうぞ宜しくお願い致します。

    2012年3月6日 7:26
  • Keiichi Oumi様、返信ありがとうございます!

    リクエストの制限??という状態ですので、まずは教えて頂いたサイトを見て勉強します!

    ちなみにOSはWindows Server 2008 or 2008 R2のどちらの可能性もあります・・・。

    2012年3月6日 7:28