Project.jsonとは
Kプロジェクトでは、プロジェクトの情報はProject.jsonに記載します。これまで、Web.config/Global.asax/pakage.config/*.csprojといった主要ファイルに記載していた情報は、Project.jsonに記述することになります。
{ "webroot" : "wwwroot", "exclude": "wwwroot/**/*.*", "dependencies": { "EntityFramework.SqlServer": "7.0.0-alpha4", "Microsoft.AspNet.Mvc": "6.0.0-alpha4", "Microsoft.AspNet.Identity.SqlServer": "3.0.0-alpha4", "Microsoft.AspNet.Identity.Authentication": "3.0.0-alpha4", "Microsoft.AspNet.Security.Cookies": "1.0.0-alpha4", "Microsoft.AspNet.Server.IIS": "1.0.0-alpha4", "Microsoft.AspNet.Server.WebListener": "1.0.0-alpha4", "Microsoft.AspNet.StaticFiles": "1.0.0-alpha4", "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-alpha4", "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-alpha4" }, "commands": { /* Change the port number when you are self hosting this application */ "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000" }, "frameworks": { "aspnet50" : { }, "aspnetcore50" : { } } }
まず、依存するアセンブリの情報は「dependencies」セクションに記述します。例えば「Microsoft.AspNet.Mvc」のバージョン6.0.0-alpha4が必要と記述すれば、NuGetやMyGetからDLLと依存DLLをダウンロードしてくれます。(MyGetはMicrosoftも利用している商用Nugetホスティングサービスです。OSSプロジェクトは無償で利用でき、開発中のvNextアセンブリもMyGetで配布されています)。Visual Studioでは、プロジェクトを開いた時やProject.jsonファイルの保存時に、必要なアセンブリの解決を行ってくれます。
Project.jsonファイルには、依存アセンブリ情報(dependencies)以外にも、コマンド(commands)、ビルトイベント(script)、IISのルートフォルダ(webroot)等を設定できます。詳細は、Project.jsonの説明ページをご覧ください。
System.WebからMicrosoft.AspNet名前空間へ
依存アセンブリ情報(dependencies)の中身を見ていると、Microsoft.AspNetという名前空間を使用していることがわかります。vNextアプリケーションでは、IISと強いつながりがあった機能を、System.Web名前空間からMicrosoft.AspNet名前空間へと移動しています。これにより、これまで使用してきたSystem.Web名前空間のHttpContext/HttpRequest/HttpResponseクラスは Microsoft.AspNet.Http名前空間の同名クラスに移動されています。従来の継承不可クラスから抽象クラスへ変更されているため、ユニットテストやモックが簡単になっています。これに伴い、具象クラスとして Microsoft.AspNet.PipelineCore名前空間のDefaultHttpConetxt/DefaultHttpRequest/DefaultHttpResponseクラスが提供されています。
なお、System.*からMicrosoft.*に移動する効果として、.NET Frameworkよりも早いライフサイクルでASP.NETがバージョンアップされることも期待されています。
実行
それでは、vNextアプリケーションを実行してみましょう。
RosylnによるASP.NETアプリケーションのビルド
デバッグ実行(F5キー)するとブラウザにトップ画面が表示されます。ここでは、Binフォルダの配下にDLLファイルが生成されていないことに注目してください。従来はBinフォルダ配下にDLLファイルが生成されていました。これはRoslynという新しいコンパイラが、C#のファイルを動的にビルドしてメモリ上に展開しているためです。実行時にC#のコードがビルドされるため、デプロイ前にDLLを生成しておく必要がなく、サーバー側で簡単にC#のソースを変更できるようになりました。
Visual Studioでの開発時も「デバッグなしで開始(Ctrl+F5キー)」にて起動すれば、IIS Express実行中にC#のコードを変更できるため、オンザフライでのホットデプロイ開発が可能となります。
ターゲットフレームワークをASP.NET Coreに変更
vNextアプリケーションの特徴として、.NET Frameworkの設定で「ASP.NET 5.0(従来の.NET Framework)」だけではなく「ASP.NET Core5.0(新しい.NET Core Framework)」も選択できるようになりました。
デフォルトで設定されている「ASP.NET 5.0」は「CLR」や「DesktopCLR」と呼ばれるWindowsにインストールされている.NET Frameworkです。「ASP.NET Core 5.0」は「CoreCLR」と呼ばれる新しいクラウド向け.NET Frameworkサブセットです。
ブラウザの表示は同じですが、IIS Expressのログを見ると、以下のように読み込んでいる物理ファイルが異なることがわかります。
(System.Runtime.dllをGACからロード) 'iisexpress.exe' (CLR v4.0.30319: Helios): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Runtime\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.dll'. (EntityFramework.dllをKPMのaspnet50からロード) 'iisexpress.exe' (CLR v4.0.30319: Helios): Loaded 'C:\Users\aoki\.kpm\packages\EntityFramework\7.0.0-alpha4\lib\aspnet50\EntityFramework.dll'.
(System.Runtime.dllをKREからロード) 'iisexpress.exe' (CoreCLR: klr.core45.managed): Loaded 'C:\Users\aoki\.kre\packages\KRE-CoreCLR-x86.1.0.0-alpha4\bin\System.Runtime.dll'. (EntityFramework.dllをKPMのaspnetcore50からロード) 'iisexpress.exe' (CoreCLR: klr.core45.managed): Loaded 'C:\Users\aoki\.kpm\packages\EntityFramework\7.0.0-alpha4\lib\aspnetcore50\EntityFramework.dll'.
前者のDesktopCLRでは、.NET FrameworkのアセンブリをGAC(C:¥Windows¥Microsoft.NET¥assembly)から読みこんでいますが、後者のCoreCLRでは、ユーザーのKRE(C:¥Users¥<ユーザー名>¥kre¥packages)フォルダから読みこんでいます。KREフォルダはKプロジェクトの実行環境が格納されるフォルダです。
このような仕組により、CoreCLRでは、サーバーに必要な.NET Frameworkをインストールしていなくても、ASP.NETアプリケーションを動かせるようになります。