Поддержка нескольких версий .NET (из серии статей про VS 2010 и .NET 4)

Это третья из серии публикаций, в которых я пишу о готовящихся к выходу VS 2010 и .NET 4.

Сегодня мы обсудим расширенные возможности VS 2010 по поддержке нескольких версий целевых платформ, что позволит вам создавать приложения для нескольких версий .NET. Мы сделали существенные архитектурные изменения в VS 2010, чтобы реализовать некоторые новые возможности и в целом намного упростить для разработчиков работу с различными целевыми версиями .NET.

Понимание установки бок о бок

VS 2010 можно установить “бок о бок” с предыдущими версиями Visual Studio. Это значит, что вы можете установить ее на одну машину с VS 2008/VS 2005/VS 2003 – и использовать все установленные версии одновременно, если вам захочется.

.NET 4.0 также может быть установлена на одной машине “бок о бок” с предыдущими версиями .NET. В .NET 4.0 используются новые номера версий как для сборок библиотеки, так и для движка CLR, т.е. она работает совершенно независимо от .NET 2.0, 3.0 и 3.5. Таким образом, вы можете установить .NET 4.0 на машине, где уже установлены .NET 2.0/3.0/3.5, и настроить часть приложений на работу с .NET 4.0, а остальные оставить выполняться с использованием предыдущих версий .NET (для приложений ASP.NET такую настройку можно осуществить с помощью инструмента администрирования IIS). Это позволяет вам использовать .NET 4.0 для новых приложений без необходимости обязательно тестировать по новой и обновлять ваши существующие приложения.

Поддержка нескольких версий целевых платформ в VS 2008

VS 2008 была первой версией Visual Studio, где мы реализовали поддержку нескольких версий .NET. Это позволило использовать VS 2008 для создания и редактирования не только проектов для .NET 3.5, но также и проектов для .NET 3.0 и .NET 2.0. За счет этого разработчики смогли быстрее обновиться на новую версию Visual Studio и получить преимущества от использования ее новых возможностей и при этом не требовать установки новой версии .NET на клиентские и серверные машины, где выполняются их приложения.

При реализации поддержки нескольких версий целевых платформ в VS 2008 мы могли воспользоваться тем обстоятельством, что .NET 2.0, .NET 3.0 и .NET 3.5 выполняются под управлением одной и той же версии CLR, и что основное отличие между этими версиями .NET заключается в библиотеках. В результате компиляторы Visual Studio могли создавать один и тот же IL-код, отладчик мог работать с одним движком CLR, а поддержка нескольких версий целевых платформ в IDE главным образом заключалась в отфильтровывании новых сборок и шаблонов проектов, чтобы они не появлялись в случае выбора версии .NET, с которой они не поддерживаются.

И эта поддержка нескольких версий целевых платформ работала, хотя и была далека от идеала. IntelliSense в VS 2008 всегда показывает типы и члены для библиотек из .NET 3.5 (даже если вы создаете проект под .NET 2.0). В результате вы, порой, можете по невнимательности начать использовать метод, который реализован лишь ASP.NET 3.5, несмотря на то, что работаете над проектом приложения ASP.NET 2.0.

Поддержка нескольких версий целевых платформ в VS 2010

Мы осуществили серьезные архитектурные изменения в VS 2010, чтобы реализовать намного лучшую и более корректную поддержку нескольких целевых платформ.

В комплект поставки VS 2010 теперь для каждой версии .NET входит то, что мы называем “справочными сборками” (“reference assemblies”). “Справочная сборка” содержит лишь метаданные определенной сборки из каркаса приложения без конкретной реализации (за счет чего существенно сокращается ее размер). Между тем, этих метаданных достаточно, чтобы обеспечить VS 2010 всегда 100%-точную работу IntelliSense при выборе в качестве целевой той или иной версии .NET. Это также означает, что свойства, доступные через перечень свойств в дизайнерах, списки API в обозревателе объектов (Object Browser) и различные другие места в IDE точно отражают сигнатуры соответствующих методов, свойств, объектов выбранной версии API.

В VS 2010 мы также обновили отладчик, профилировщик и компиляторы, чтобы они поддерживали проекты для различных версий CLR.

Использование поддержки нескольких версий целевых платформ в VS 2010

Чтобы лучше понять, как работают эти новые возможности поддержки нескольких версий целевых версий .NET, давайте создадим новое веб-приложение ASP.NET Web с помощью VS 2010. Мы можем выбрать пункт меню “File->New Project”, чтобы появился диалог создания нового проекта. Воспользуемся выпадающим списком для выбора версии в верхней части диалога, чтобы отфильтровать лишь те шаблоны проектов, которые поддерживаются при использовании .NET 2.0. Затем создадим новый проект веб-приложения ASP.NET 2.0:

step1

Поскольку для нашего проекта мы выбрали в качестве целевой платформы .NET 2.0, VS 2010 автоматически изменит инструментальную панель и настройку IntelliSense, чтобы позволить нам использовать лишь те элементы управления, которые поставляются с ASP.NET 2.0. В отличие от VS 2008, окно свойств элементов управления в VS 2010 теперь автоматически отфильтровывает свойства и отображает лишь те, которые доступны при использовании элемента управления "кнопка" в ASP.NET 2.0:

step2

При написании кода VS 2010 также теперь будет показывать информацию IntelliSense лишь для тех типов и методов/свойств/событий, которые поддерживаются в .NET 2.0. Ниже вы можете увидеть, что показывает IntelliSense объекта “Response” ASP.NET 2.0, когда мы набираем “Response.Re”:

step3

Когда мы запустим приложения, используя встроенный в VS веб-сервер, оно будет работать с версией ASP.NET 2.0 (а отладчик VS 2010 будет отлаживать процесс CLR 2.0):

step5

Перевод проектов с .NET 2.0 на .NET 4.0

При желании мы можем изменить целевую версию .NET для нашего проекта на последнюю доступную версию в диалоге свойств проекта, который доступен, например, из контекстного меню проекта в обозревателе решения (solution explorer). Там из выпадающего списка “target framework” мы можем выбрать ту версию .NET Framework, которая нам нужна:

stp8

Как показано выше, мы можем выбирать из множества доступных версий .NET. В списке также есть профиль “Server Core”, ориентированный на работу под управлением Windows Server 2008 R2, установленным без графического пользовательского интерфейса; в рамках этого профиля не поддерживаются некоторые API. Поскольку IntelliSense и справочные сборки, которые мы используем для получения метаданных, могут поддерживать любые версии и выпуски, мы даже сможем распространять новые версии справочных сборок вместе с будущими сервис-паками, если в последних появятся какие-либо новые API (что позволит достичь 100% точности работы IntelliSense).

В нашем примере изменим настройку проекта на использование .NET 4.0. Когда мы это сделаем, VS 2010 автоматически обновит перечень используемых "справочных сборок", а также файл web.config для нашего проекта, чтобы отразить сделанные изменения.

После изменения целевой версии .NET VS 2010 отфильтрует элементы управления на панели инструментов и информацию для IntelliSense, чтобы все новые элементы управления и свойства, доступные в версии ASP.NET 4.0. К примеру, в перечне свойств на рисунке ниже теперь отображается новое свойство “ClientIDMode”, доступное для всех элементов управления в ASP.NET 4.0. Это свойство позволяет вам управлять тем, как будут создаваться идентификаторы элементов управления на клиенте (client IDs), что позволит вам избежать появления уродливых идентификаторов элементов управления (эта новая возможность ASP.NET 4.0, о которой я напишу позже в своем блоге):

stp9

После того, как мы обновили проект для использования .NET 4.0, VS 2010 также начнет показывать нам информацию IntelliSense для новых типов и методов/свойств/событий в .NET 4.0. К примеру, ниже вы можете увидеть некоторые из методов перенаправления, доступные в ASP.NET 4.0 для объекта “Response” (которые прежде не показывались, когда для проекта целевой еще была версия .NET 2.0):

step7

Новый метод Response.RedirectPermanent() на рисунке выше позволяет легко разрешить проблемы, связанные с HTTP-ответами “HTTP 301 Moved”, из-за которых число ссылок, набранное вашим сайтом с точки зрения поисковых системы, могло бы оказаться меньше, чем хотелось бы. Теперь и приложения на базе ASP.NET Web Forms, и приложения на базе ASP.NET MVC поддерживают URL Routing engine, так что новый метод Response.RedirectToRoute() позволит вам легко перенаправлять запросы на нужный маршрут.

Наконец, когда приложение из нашего проекта будет запускаться на встроенном в VS веб-сервере, VS 2010 станет выполнять его, используя версию ASP.NET 4.0:

step9

Резюме

Поддержка нескольких целевых версий .NET в VS 2010 позволяет вам работать над проектами под версии .NET 4.0, .NET 3.5, .NET 3.0 и .NET 2.0. Благодаря этому вы можете воспользоваться всеми преимуществами новой версии среды разработки без необходимости немедленно обновить клиентские машины и сервера, на которых выполняются ваши приложения, до .NET 4.0. А благодаря улучшенной поддержке нескольких целевых версий платформы работу с такими проектами в VS стала корректнее и еще удобнее, чем прежде.

Надеюсь, вы нашли для себя что-то полезное,

Скотт

P.S. Помимо блога, я в последнее время еще использую Twitter, чтобы публиковать краткие заметки и новые ссылки. Следить за моими публикациями на Twitter вы можете здесь: https://www.twitter.com/scottgu (@scottgu - это мой псевдоним на twitter)

оригинал статьи