none
WorkerRole内で動作するモジュールの動作.NETframework Versionについて RRS feed

  • 質問


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

    モジュールは、以下の2種類を指しています。

    (1)WorkerRoleのプロジェクト内で作成したモジュール。配備時にWorkerRole1.dllとなるもの。(%RoleName%.dll)

      →ソリューション(プロジェクト)作成時に指定した、.NET frameworkのVersion?

    (2)WorkerRoleプロジェクトに自分でパッケージングしたモジュール(dll)。

       →コンパイルした環境の.NET frameworkのVersion?(<TargetFrameworkVersion>で指定するもの)

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

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

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

    WebRoleの場合は、IISの.NETframework Version設定で動作すると思われるのですが、

    WorkerRoleはどうのようになっているのかが分かりません。

    この質問を通して知りたいことは、WorkerRoleに自分で持ち込むDLLの動作.NETframework Versionです。

    もし、コンパイルしたVersionと異なるのであれば、Version間の非互換の修正を実施・調査しようと考えています。

    (32bitDLLのAnyCPUor64bitDLL化はどこかでみたのですが、.NET frameworkVersionについては情報見つかりませんでした。)

    参考フォーラム:IISの.NETframework Version設定について

    http://social.msdn.microsoft.com/Forums/ja-JP/iis7ja/thread/c5ee2f46-30de-4073-bd71-bd2624297de3

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

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


    2012年2月23日 2:24

回答

  • こんにちは。

    WorkerRole(というよりRoleEntryPoint)そのものは.NET Framework 3.5 or .NET Framework 4のどちらかになるかと。
    ※VSを使う場合はWorkerRoleのプロジェクトのプロパティで選択できます。(.csdefでRoleEntryPointとビルド時のバージョンを指定することもできます)
    ※AzureのRuntimeが.NET3.5以上でないと使えないので他の選択肢がないかと…

    自作のモジュールをどう利用するかで変わりますが、IIS配下ではないのでSide-by-Sideで普通に利用できそうな気はします。

    http://msdn.microsoft.com/ja-jp/library/ee518876.aspx

    アセンブリ回りはあまり詳しくはないので参考まで

    2012年2月23日 3:50
    モデレータ
  • 補足です。

    RoleEntryPoint(WorkerRole)を.NET 3.5でビルドした場合、動作バージョン的には.NET 2.0(CLR v2.0.50727)になるかと思います。

    .NET 4の場合はv4.0.30319上での動作です。

    ※RoleEntryPointが、というよりはRoleEntryPointをホストするWorkerRoleのプロセス(WaWorkerHost.exe)が指定されたバージョンで動作するといった感じかと。

    あとは使いたい機能や目的に応じて選択すればよいかと思います。

    2012年2月23日 4:43
    モデレータ

すべての返信

  • こんにちは。

    WorkerRole(というよりRoleEntryPoint)そのものは.NET Framework 3.5 or .NET Framework 4のどちらかになるかと。
    ※VSを使う場合はWorkerRoleのプロジェクトのプロパティで選択できます。(.csdefでRoleEntryPointとビルド時のバージョンを指定することもできます)
    ※AzureのRuntimeが.NET3.5以上でないと使えないので他の選択肢がないかと…

    自作のモジュールをどう利用するかで変わりますが、IIS配下ではないのでSide-by-Sideで普通に利用できそうな気はします。

    http://msdn.microsoft.com/ja-jp/library/ee518876.aspx

    アセンブリ回りはあまり詳しくはないので参考まで

    2012年2月23日 3:50
    モデレータ
  • k.buchi様、返信ありがとうございます。

    >自作のモジュールをどう利用するかで変わりますが、IIS配下ではないのでSide-by-Sideで普通に利用できそうな気はします。

    →自作のモジュールは、VBで作っている部品群で、WebRole側の処理から.NET Remotingで各DLLの処理を呼出しています。

    紹介して頂いたサイトの見るに、「アプリケーションは、ビルドに使用されたバージョンの .NET Framework で実行されます。」と記載されているので、

    想像と同じく、以下のようになるようです。

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

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

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

    気になることが、WebRoleとWorkerRoleで動作Versionが異なる点です。

    WebRoleでは、IISで設定したVersionで動作するようなので以下のようになり、

    IIS設定:4.0

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

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

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

    WorkerRoleでは、ビルドに使用されたバージョンで動作するようなので、以下のようになります。

    WorkerRoleのプロジェクトのプロパティ設定:4.0

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

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

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

    今回、.NET Remotingを利用している関係で、同一のDLLをWebRole、WorkerRoleへ配置しています。

    上記のようなことになるのならば、各DLLを4.0化した方がいいように思います。

    .NET Frameworkは難しいですね・・・内部的な構造や仕組みがよく分かりません。

    2012年2月23日 4:19
  • 補足です。

    RoleEntryPoint(WorkerRole)を.NET 3.5でビルドした場合、動作バージョン的には.NET 2.0(CLR v2.0.50727)になるかと思います。

    .NET 4の場合はv4.0.30319上での動作です。

    ※RoleEntryPointが、というよりはRoleEntryPointをホストするWorkerRoleのプロセス(WaWorkerHost.exe)が指定されたバージョンで動作するといった感じかと。

    あとは使いたい機能や目的に応じて選択すればよいかと思います。

    2012年2月23日 4:43
    モデレータ
  • k.buchi様、返信ありがとうございます。

    説明が分かりやすく助かります!

    ご存知でしたら教えて頂きたいのですが、上記に記載した「WebRoleとWorkerRoleで動作Versionが異なる点です。」の

    部分について何か情報や参考サイトがあれば教えて頂けないでしょうか?

    2012年2月23日 5:03
  • こんにちは。

    根本的なAzure上の動作の仕組みですが、WorkerRoleのRoleEntryPointはWaWorkerHost.exeで実行されます。
    通常WorkerRoleの処理はRoleEntryPointのRunメソッドなどで実行しますので、動作バージョンはRoleEntryPointをビルドする際に指定したバージョン(=WorkerRoleのプロジェクトのバージョン)になります。

    Web Role(のFull IIS)の場合、RoleEntryPointは指定したバージョンでWaWebHost.exeで動作し、WorkerRoleと同じようになると思いますが、Webアプリ部分はIISのアプリケーションプール内で動作することになります。(結局WebRoleのプロジェクトを.NET Framework 3.5に設定したらv2.0.50727=AppPoolのv2.0で動作することになりますが)

    WebRoleとWorkerRoleで動作Versionが異なる」 ですが、指定したもので動作するという点では変わらないかと思われます。

    2012年2月23日 5:24
    モデレータ
  • k.buchi様、返信ありがとうございます!

    何度も回答頂きありがとうございます。お手数かけます。

    >根本的なAzure上の動作の仕組みですが、WorkerRoleのRoleEntryPointはWaWorkerHost.exeで実行されます。
    >通常WorkerRoleの処理はRoleEntryPointのRunメソッドなどで実行しますので、動作バージョンはRoleEntryPointをビルドする際に指定したバージョン>(=WorkerRoleのプロジェクトのバージョン)になります。

    WorkerRoleプロジェクトに自分で追加・コーディングしたvbファイル等(WorkerRole1.dll)は、WorkerRoleのプロジェクトのバージョンで動作することは想像できるのですが、上記の内容は、自分でパッケージングしたdllファイルについても、WorkerRoleのプロジェクトのバージョンで動作するという認識で宜しいのでしょうか?

    もしくは、自分でパッケージングしたdllファイルはSide-by-SideでWorkerRoleのプロジェクトのバージョンではなく、「ビルドに使用されたバージョン」で動作するなのでしょうか?

    上記の内容からすると、どのようなVersionで作成された資産にせよWaWorkerHost.exeで動作しているのだから、WaWorkerHost.exeの設定元となる、WorkerRoleのプロジェクトのバージョンで動作する!ということだと思っているのですが・・・。

    >Web Role(のFull IIS)の場合、RoleEntryPointは指定したバージョンでWaWebHost.exeで動作し、WorkerRoleと同じようになると思いますが、Webアプリ部>分はIISのアプリケーションプール内で動作することになります。(結局WebRoleのプロジェクトを.NET Framework 3.5に設定したらv2.0.50727=AppPoolの>v2.0で動作することになりますが)

    「WebRoleのプロジェクトの設定=IISの設定(AppPool)」になる感じなのでしょうか?

    IISの設定はアプリケーションの設定とは別モノだと勘違いしていました。。。

    理解不足で申し訳ありません。。。


    2012年2月23日 7:07
  • アセンブリをロードする際に異なるCLRで実行できるようにするのがインプロセスSide-by-sideだと思っているので、WorkerRole内で自作のモジュールを呼び出す際にどのようにするかでそのモジュールがどのバージョンで動作するのかが決まる気がします。

    ※ビルド時というよりはどのCLRバージョンで動作するか/サポートするか等をCLR側が判断してロードしてる感じでしょうか

    何もしなければそのまま呼び出し元のCLRで動作すると思われます。

    Web Roleの件ですがエミュレータ上で.NET Framework 3.5でWeb Roleプロジェクトを実行させるとAppPoolはv2.0になっていました。

    ※Azure側(エミュレータ側)でIISの設定を行う際に適切なものに設定してそうです。

    2012年2月23日 7:15
    モデレータ
  • k.buchi様、返信ありがとうございます!

    >アセンブリをロードする際に異なるCLRで実行できるようにするのがインプロセスSide-by-sideだと思っているので、WorkerRole内で自作のモジュールを呼び出す際にどのようにするかでそのモジュールがどのバージョンで動作するのかが決まる気がします。

    >※ビルド時というよりはどのCLRバージョンで動作するか/サポートするか等をCLR側が判断してロードしてる感じでしょうか

    >何もしなければそのまま呼び出し元のCLRで動作すると思われます。

    紹介して頂いたサイトを見ても、dllの種類(というかアプリの種類?)によってCLR?が判断して
    動作バージョンが決まるようなことが記載されています。

    まず、自作のモジュールがどの種類なのか?を調査してみたいと思います。
    (誰が作ったか分からないようなモジュールなので調査自体が難しいかも知れませんが・・・)

    ***********以下、引用部***************************************************************
    シナリオ 1: 以前のバージョンの .NET Framework でビルドされた COM コンポーネントを使用するネイティブ アプリケーション。
    COM コンポーネントは、そのコンポーネントが登録されているバージョンの .NET Framework で実行されます。

    シナリオ 2: .NET Framework 2.0 SP1 でビルドされたマネージ アプリケーション。
    .NET Framework Version 2.0 で優先的に実行しますが、Version 2.0 がない場合は .NET Framework 4 で実行します。

    シナリオ 3: 以前のバージョンの .NET Framework でビルドされた COM コンポーネントを使用するネイティブ アプリケーション。
    .NET Framework 4 で実行します。
    **************************************************************************************

    内容を見てまた行き詰ったら質問させて頂こうと思いますので、宜しくお願い致します!!

    >Web Roleの件ですがエミュレータ上で.NET Framework 3.5でWeb Roleプロジェクトを実行させるとAppPoolはv2.0になっていました。

    >※Azure側(エミュレータ側)でIISの設定を行う際に適切なものに設定してそうです。

    →わざわざ確認して頂きありがとうございます!
    2012年2月23日 8:40