トップ回答者
WorkerRole内で動作するモジュールの動作.NETframework Versionについて

質問
-
標題の件について何か情報をお持ちの方がいればご教授下さい。モジュールは、以下の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サイトがあれば教えて頂きたいです。
※その他に判断や回答に必要な情報があれば、追記致します。
- 編集済み .NET初心者というより全て初心者 2012年2月23日 2:26
回答
-
こんにちは。
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
アセンブリ回りはあまり詳しくはないので参考まで
- 回答としてマーク Sunao TomitaMVP, Editor 2012年5月17日 12:58
-
補足です。
RoleEntryPoint(WorkerRole)を.NET 3.5でビルドした場合、動作バージョン的には.NET 2.0(CLR v2.0.50727)になるかと思います。
.NET 4の場合はv4.0.30319上での動作です。
※RoleEntryPointが、というよりはRoleEntryPointをホストするWorkerRoleのプロセス(WaWorkerHost.exe)が指定されたバージョンで動作するといった感じかと。
あとは使いたい機能や目的に応じて選択すればよいかと思います。
- 回答としてマーク Sunao TomitaMVP, Editor 2012年5月17日 12:58
すべての返信
-
こんにちは。
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
アセンブリ回りはあまり詳しくはないので参考まで
- 回答としてマーク Sunao TomitaMVP, Editor 2012年5月17日 12:58
-
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は難しいですね・・・内部的な構造や仕組みがよく分かりません。
-
補足です。
RoleEntryPoint(WorkerRole)を.NET 3.5でビルドした場合、動作バージョン的には.NET 2.0(CLR v2.0.50727)になるかと思います。
.NET 4の場合はv4.0.30319上での動作です。
※RoleEntryPointが、というよりはRoleEntryPointをホストするWorkerRoleのプロセス(WaWorkerHost.exe)が指定されたバージョンで動作するといった感じかと。
あとは使いたい機能や目的に応じて選択すればよいかと思います。
- 回答としてマーク Sunao TomitaMVP, Editor 2012年5月17日 12:58
-
こんにちは。
根本的な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が異なる」 ですが、指定したもので動作するという点では変わらないかと思われます。
-
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の設定はアプリケーションの設定とは別モノだと勘違いしていました。。。
理解不足で申し訳ありません。。。
- 編集済み .NET初心者というより全て初心者 2012年2月23日 7:08
-
アセンブリをロードする際に異なるCLRで実行できるようにするのがインプロセスSide-by-sideだと思っているので、WorkerRole内で自作のモジュールを呼び出す際にどのようにするかでそのモジュールがどのバージョンで動作するのかが決まる気がします。
※ビルド時というよりはどのCLRバージョンで動作するか/サポートするか等をCLR側が判断してロードしてる感じでしょうか
何もしなければそのまま呼び出し元のCLRで動作すると思われます。
Web Roleの件ですがエミュレータ上で.NET Framework 3.5でWeb Roleプロジェクトを実行させるとAppPoolはv2.0になっていました。
※Azure側(エミュレータ側)でIISの設定を行う際に適切なものに設定してそうです。
-
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の設定を行う際に適切なものに設定してそうです。
→わざわざ確認して頂きありがとうございます!- 編集済み .NET初心者というより全て初心者 2012年2月23日 8:41