Знакомство с ASP.NET 5
У каждого свой путь знакомства с ASP.NET 5. И чем раньше его начать, тем лучше. Разобраться в «ASP.NET 5» необходимо всем, кто занимается разработкой на платформе .NET.Т. к. «ASP.NET 5» это не совсем о веб. Точнее не только о веб. Просмотрев N-ое количество видео и прочитав еще больше количество блогов (документация еще не готова) возникло непреодолимое желание где-то что-то написать.ASP.NET 5 — это не просто очередная версия ASP.NET в рамках .NET Framework. На самом деле, это новый Framework без CLR (которая ставится отдельно) и без BCL (которая превратилась в набор NuGet-пакетов, которые ставятся из nuget.org).
Отделение CLR от Framework сделано через хитрую штуку под названием DNX — .NET Execution Environment. Больше нет разделения на design-time и run-time. Больше нет отдельных зависимостей в сборках, между проектами и между nuget-пакетами. Теперь есть просто зависимость. Это может быть проект (в исходниках), сборка (dll) или Nuget-пакет. Для проекта в исходниках его зависимости указываются в файле project.json, который не зависит от платформы и используемой IDE. При разрешении зависимости (не важно в runtime или в design-time) она либо просто загружается (сборка), либо скачивается (nuget), либо компилируется Roslyn«ом (исходники). Т.о. с помощью Roslyn поддерживается компиляция «на лету». Например, можно в развернутом приложении заменить зависимый проект на его исходники.
В системе может быть несколько dnx. Для управления ими есть набор скриптов (PowerShell) dnvm — .NET Version Manager. Явно некий аналог NVM (Node Version Manager).Есть DNX, использующая CLR из полного .NET Framework, есть для Mono и есть для CoreCLR (кросс-платформенной CLR, которая в скором времени помимо Windows будет работать на Linux и MacOS). DNX для CoreCLR включает CLR внутри себя.
Ситуация несколько запутана из-за того очень много новых абревиатур, плюс недавно (накануне dotnetConf) был мощный ребрендинг (последний ли?). Ранее DNX назывался KRE (а хост процесс klr.exe) (в VS CTP6 это все еще так), DNVM — KVM. Был еще KPM (K Package Manager), теперь это просто Nuget.
Поняв, что AspNet5 это не Asp.Net, а новый .NET, шаблон проекта «ASP.NET 5 Console Application» уже не шокирует. Это действительно Console Application под инфраструктурой DNX.Забавно, что Build проекта в VS по умолчанию не создает никаких dll в папке bin, как раньше. Можно включить опцию «Produce outputs on build» в настройках проекта VS (да, файл проекта VS все же есть — .kproj, но он теперь опциональный), тогда Build будет создавать dll в папке $solutionDir\artifacts\bin\ConsoleApp1\Debug\aspnet50\. Где «aspnet50» — это имя фрейворка или runtime flavor. Помимо aspnet50 есть еще aspnetcore50. Что такое «фреймворк» в контексте DNX не до конца мне понятно. Но, грубо говоря, это множество DNX одного вида: либо на основе CLR из .NET Framework, либо на основе CoreCLR.Все DNX хранятся в профиле юзера: C:\Users\Shrike\.dnx\runtimesВ старых версиях (для VS CTP6 по-прежнему): C:\Users\Shrike\.k\runtimes
Там же, кстати, и хранится кэш всех пакетов — \.dnx\packages\Видимо, благодаря этому кэшу при редактировании project.json в VS поддерживается intelliSence при редактировании зависимостей:
Увидеть все установленные в системе DNX можно с помощью команды dnvm list. Одна из DNX является «по умолчанию», ее использует VS, если для проекта явно не задан тип runtime.
Обратим внимание, что билд консольного приложения создает dll, а не exe. А как же его теперь запустить (не из VS)? Чтобы запустить приложение, его надо опубликовать — делаем Publish из VS. Также это можно сделать из командной строки с помощью dnu publish. При публикации мы указываем publish target. Для консольного приложения сейчас доступен только таргет «File System». Набор publish targets будет расширяться. Например, для Web-приложения уже доступен Azure Websites. При публикации в File System мы выбираем папку, в которую будет помещен дистрибутив. В ней будет создано:
bash-скрипт для Linux: ConsoleApp1 cmd-скрипт для Windows: ConsoleApp1.cmd папка approot, внутри папка packages, а внутри: папка ConsoleApp1 с приложение папка kre-clr-win-x86.1.0.0-beta3 с исполняемой средой (DNX) Скрипт ConsoleApp1.cmd запускает наше приложение с помощью команды:
@»%~dp0approot\packages\kre-clr-win-x86.1.0.0-beta3\bin\klr.exe» — appbase »%~dp0approot\src\ConsoleApp1» Microsoft.Framework.ApplicationHost ConsoleApp1%* Это что же получается. Дистрибутив программы содержит саму .NET в себе. Точнее содержит DNX. В данном случае используемая DNX использует CLR из глобального .NET на машине. Но приложение можно опубликовать, используя DNX для CoreCLR. И тогда, в дистрибутиве будет вообще всё (т.к. DNX для CoreCLR содержит саму CLR), что требуется приложению.Подробней про DNX и прочий ужас рантайм в MSDN Mag.
После всего этого, утверждение, что ASP.NET 5 не зависит от System.Web, вообще кажется очевидным. ASP.NET 5 не зависит ни от чего. ASP.NET 5 это новый runtime и огромное количество NuGet-пакетов, содержащих все то, что было в BCL Framework«а (только переписанное начисто). Множество пакетов Microsoft.AspNet.* можно условно объединить в «ASP.NET 5».