Проблемы при миграции на .NET Framework 4

В этом разделе описываются проблемы с миграцией между .NET Framework 3.5 с пакетом обновления 1 (SP1) и .NET Framework 4, в том числе исправления, изменения для соответствия стандартам и безопасности, а также изменения, внесенные по отзывам пользователей. Большинство изменений не требуют каких-либо программных изменений в ваших приложениях. Случаи, требующие изменений, описаны в столбце "Рекомендованные изменения" таблицы.

Этот раздел описывает изменения в следующих областях.

  • ASP.NET и Интернет

  • Ядро

  • Данные

  • Windows Communication Foundation (WCF)

  • Windows Presentation Foundation (WPF)

  • XML

Более общий обзор рассмотренных в данном разделе проблем см. в разделе Руководство по миграции на .NET Framework 4.

В отношении проблем с миграцией после выпуска Beta 2 обратитесь к документу Migration Issues for .NET Framework 4 Applications: Beta 2 to RTM.

Сведения о новых возможностях см. в разделе Новые возможности .NET Framework 4.

ASP.NET и Интернет

Пространства имен: System.Web, System.Web.Mobile, System.Web.Security, System.Web.UI.WebControls; сборка: System.Web (в System.Web.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Файлы описания обозревателя

Файлы определения браузеров обновлены, теперь они включают информацию о новых и обновленных браузерах и устройствах. Устаревшие браузеры и устройства (например Netscape Navigator) удалены; новые браузеры и устройства (например Google Chrome и Apple iPhone) добавлены.

Если ваше приложение содержит пользовательские определения браузеров, унаследованные от одного из удаленных определений браузеров, будет получена ошибка.

Объект HttpBrowserCapabilities (предоставляемый свойством Request.Browser страницы) управляется файлами определений браузеров. Поэтому информация, возвращаемая путем обращения к свойству этого объекта, в ASP.NET 4 может отличаться от информации, возвращаемой в более ранней версии ASP.NET.

Если ваше приложение строится на старых файлах определения браузеров, их можно скопировать из папки:

Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers.

Скопируйте файлы в соответствующую папку \CONFIG\Browsers для ASP.NET 4. После копирования файлов запустите средство командной строки Aspnet_regbrowsers.exe. Дополнительные сведения см. на веб-сайте http://www.asp.net/mobile.

Дочерние приложения, работающие в смешанных версиях ASP.NET

Приложения ASP.NET 4, настроенные как дочерние для приложений, использующих предыдущие версии ASP.NET, могут не запускаться из-за ошибок конфигурации или компиляции. Конкретная возникающая ошибка зависит от того, где выполняется приложение — в IIS 6.0 или в IIS 7 либо IIS 7.5.

Можно внести изменения в файлы конфигурации затронутых приложений, чтобы система конфигурации правильно распознавала приложение ASP.NET 4. Сведения об изменениях, которые необходимо внести, см. в разделе "ASP.NET 4 Child Applications Fail to Start When Under ASP.NET 2.0 or ASP.NET 3.5 Applications" документа ASP.NET 4 Breaking Changes на веб-сайте ASP.NET.

Изменения ClientID

Новый параметр ClientIDMode в ASP.NET 4 позволяет задать способ создания платформой ASP.NET атрибута id для HTML-элементов. В более ранних версиях ASP.NET поведение по умолчанию соответствовало параметру AutoID ClientIDMode. Теперь параметр по умолчанию — Predictable. Дополнительные сведения см. в разделе Идентификация серверного веб-элемента управления ASP.NET.

Если для обновления приложения с версии ASP.NET 2.0 или ASP.NET 3.5 используется Visual Studio 2010, средство автоматически добавит в файл web.config параметр, сохраняющий поведение предыдущих версий платформы .NET Framework. Однако если вы обновляете приложение путем изменения пула приложения в IIS, задавая как целевую платформу .NET Framework 4, ASP.NET использует новый режим по умолчанию. Чтобы отключить новый режим client ID, добавьте в файл Web.config следующий параметр.

<pages ClientIDMode="AutoID" / >

Управление доступом для кода (CAS)

Функции NET ASP.NET 2.0, добавленные в ASP.NET 3.5, используют модель управления доступом для кода .NET Framework 1.1 и .NET Framework 2.0. Реализация управления доступом для кода в ASP.NET 4 значительно усовершенствована. В результате приложения ASP.NET с частичным доверием, которые зависят от выполнения доверенного кода в глобальном кэше сборок, могут давать сбой с различными исключениями безопасности. Приложения с частичным доверием, опирающиеся на расширенные изменения в политике разграничения доступа кода компьютера также могут давать сбои и создавать исключения безопасности.

Поведение приложений версии ASP.NET 4 с частичным доверием можно изменить на поведение версий ASP.NET 1.1 и 2.0, используя новый атрибут legacyCasModel в элементе конфигурации trust, как показано в следующем примере.

<trust level= "Medium"

legacyCasModel="true" />

Примечание о безопасностиПримечание по безопасности
Возврат к более старой модели управления доступом для кода может привести к снижению безопасности.

Дополнительные сведения о новой модели управления доступом для кода в ASP.NET 4 см. в разделе Управление доступом для кода для приложения ASP.NET 4.

Файлы конфигурации

Корневые файлы конфигурации (machine.config и корневой файл Web.config) для .NET Framework и ASP.NET 4 обновлены и теперь включают большую часть стандартных сведений конфигурации, которые в ASP.NET 3.5 находились в файлах Web.config приложения. Так как системы конфигурации управляемых служб IIS 7 и IIS 7.5 очень сложны, выполнение приложений ASP.NET 3.5 на платформе ASP.NET 4 и с IIS 7 или IIS 7.5 может привести к ошибкам ASP.NET или ошибкам IIS.

Обновите приложения ASP.NET 3.5 до ASP.NET 4 с помощью средств обновления проектов в Visual Studio 2010. Visual Studio 2010 автоматически изменяет файл Web.config приложений ASP.NET 3.5 так, чтобы он включал в себя соответствующие параметры для ASP.NET 4.

Однако можно запускать приложения ASP.NET 3.5, используя .NET Framework 4 без повторной компиляции. В таком случае может потребоваться вручную изменить файл Web.config приложения перед запуском этого приложения на платформе .NET Framework 4 и с IIS 7 или IIS 7.5. Конкретное изменение, которое требуется сделать, зависит от сочетания вашего программного обеспечения с учетом выпусков пакетов обновлений. Сведения о возможных сочетаниях программного обеспечения, на которые повлияет данное изменение, и о том, как разрешить проблемы, связанные с определенными сочетаниями, см. в разделе "Configuration Errors Related to New ASP.NET 4 Root Configuration" документа ASP.NET 4 Breaking Changes на веб-сайте ASP.NET.

Отображение элементов управления

В более ранних версиях ASP.NET некоторые элементы управления создавали разметку, которую нельзя было отключить. В ASP.NET 4 по умолчанию такой тип разметки больше не создается. Изменения касаются следующих элементов управления.

  • Элементы управления Image и ImageButton больше не отображают атрибут border="0".

  • Класс BaseValidator и проверочные элементы управления, производные от него, по умолчанию больше не отображают текст красного цвета.

  • Элемент управления HtmlForm не отображает атрибут name.

  • Элемент управления Table больше не отображает атрибут border="0".

Элементы управления, не предназначенные для пользовательского ввода (например элемент управления Label), больше не отображают атрибут disabled="disabled", если свойство Enabled имеет значение false (или если этот параметр унаследован ими от контейнерного элемента управления).

Если вы используете Visual Studio 2010 для обновления вашего приложения от ASP.NET 2.0 или ASP.NET 3.5, средство автоматически добавляет в файл Web.config параметр, сохраняющий традиционное отображение. Однако если вы обновляете приложение путем изменения пула приложений в IIS, задавая как целевую платформу .NET Framework 4, ASP.NET использует новый режим отображения по умолчанию. Чтобы отключить новый режим отображения, добавьте в файл Web.config следующий параметр.

<pages controlRenderingCompatibilityVersion="3.5" />

Обработчики событий в документах по умолчанию

ASP.NET 4 отображает значение атрибута action HTML-элемента form как пустую строку, когда запрос обращен к идентификатору URL без расширений, которому сопоставлен документ по умолчанию. В более ранних выпусках ASP.NET запрос сайта http://contoso.com привел бы к запросу файла Default.aspx. В этом документе открывающий тег form отображался бы, как показано в следующем примере.

<form action="Default.aspx" />

В ASP.NET 4 запрос сайта http://contoso.com также приведет к запросу файла Default.aspx, но ASP.NET теперь отображает открывающий HTML-тег form, как показано в следующем примере.

<form action="" />

Когда атрибут action является пустой строкой, объект DefaultDocumentModule IIS создает дочерний запрос файла Default.aspx. В большинстве случаев этот дочерний запрос прозрачен для кода приложения и страница Default.aspx запускается нормально. Однако возможное взаимодействие между управляемым кодом и управляемым режимом IIS 7 или IIS 7.5 может привести к тому, что управляемые ASPX-страницы перестанут работать корректно во время выполнения дочернего запроса. Если такое произойдет, дочерний запрос ASPX-документа по умолчанию приведет к ошибке или неожиданному поведению.

  • На ASPX-странице, отправляемой браузеру, атрибут action элемента form имеет значение "".

  • Форма отправляется обратно платформе ASP.NET.

  • Управляемый HTTP-модуль считывает некоторую часть тела сущности, например Request.Form или Request.Params. Это приводит к тому, что тело сущности запроса POST считывается в управляемую память. В результате тело сущности становится недоступным для каких-либо модулей машинного кода, запущенных в интегрированном режиме IIS 7 или IIS 7.5.

  • Объект DefaultDocumentModule IIS со временем выполняется и создает дочерний запрос документа Default.aspx. Однако так как тело сущности уже было считано частью управляемого кода, нет доступного тела функции для отправки в дочерний запрос.

  • При выполнении HTTP-конвейера для дочернего запроса обработчик ASPX-файлов выполняется на этапе выполнения обработчика.

Так как тела сущности нет, нет и переменных формы и нет состояния просмотра. Поэтому нет информации, позволяющей обработчику ASPX-страницы определить, какое событие должно вызываться (если какое-либо событие должно вызываться). В результате для задействованной ASPX-страницы ни один из обработчиков событий обратной передачи не выполняется.

Сведения о том, как обойти проблемы, которые могут возникнуть в результате данного изменения, см. в разделе "Event Handlers Might Not Be Not Raised in a Default Document in IIS 7 or IIS 7.5 Integrated Mode" документа ASP.NET 4 Breaking Changes на веб-сайте ASP.NET.

Алгоритм хэширования

ASP.NET использует как алгоритм шифрования, так и алгоритм хэширования для обеспечения безопасности данных, например файлов cookie проверки подлинности форм и состояния просмотра. По умолчанию ASP.NET 4 использует алгоритм HMACSHA256 для операций хэширования файлов cookie и состояния просмотра. В более ранних версиях ASP.NET использовался более старый алгоритм HMACSHA1.

При запуске приложений, использующих и ASP.NET 2.0, и ASP.NET 4, если данные, такие как файлы cookie проверки подлинности форм, должны использоваться в разными версиями .NET Framework, необходимо настроить веб-приложение ASP.NET 4 так, чтобы в нем использовался более старый алгоритм HMACSHA1. Для этого в файл Web.config нужно добавить следующий параметр.

<machineKey validation="SHA1" />

Размещение элементов управления в Internet Explorer

Элементы управления Windows Forms можно больше не размещать в Internet Explorer, поскольку существуют более предпочтительные решения по размещению элементов управления в веб-приложениях. Поэтому сборки IEHost.dll и IEExec.exe удалены из платформы .NET Framework.

Для размещения пользовательских элементов управления в веб-приложениях можно использовать следующие технологии.

  • Можно создать приложение Silverlight и настроить его для работы вне браузера. Дополнительные сведения см. в разделе Out-of-Browser Support.

  • Можно создать XAML-приложение браузера (XBAP), чтобы воспользоваться возможностями WPF (на клиентских компьютерах должна быть установлена платформа .NET Framework). Дополнительные сведения см. в разделе Общие сведения о приложениях браузера WPF XAML.

Методы HtmlEncode и UrlEncode

Методы HtmlEncode и UrlEncode классов HttpUtility и HttpServerUtility обновлены и теперь кодируют символ одиночной кавычки (') следующим образом.

  • Метод HtmlEncode кодирует экземпляры одиночной кавычки как &#39;.

  • Метод UrlEncode кодирует экземпляры одиночной кавычки как %27.

Просмотрите в коде места, где используются методы HtmlEncode и UrlEncode, и убедитесь, что изменение кодирования не повлияет на ваше приложение.

Ошибки HttpException в приложениях ASP.NET 2.0

После включения ASP.NET 4 в IIS 6 приложения ASP.NET 2.0, работающие в IIS 6 (в Windows Server 2003 или Windows Server 2003 R2), могут порождать ошибки наподобие следующей:

System.Web.HttpException: Path '/[yourApplicationRoot]/eurl.axd/[Value]' was not found.

  • Если ASP.NET 4 не требуется для запуска веб-сайта, измените сопоставление сайта для использования ASP.NET 2.0.

    – или –

  • Если ASP.NET 4 требуется для запуска веб-сайта, переместите любые дочерние виртуальные каталоги ASP.NET 2.0 на другой веб-сайт, который сопоставлен ASP.NET 2.0.

    – или –

  • Отключите URL-адреса без расширений. Дополнительные сведения см. в разделе "ASP.NET 2.0 Applications Might Generate HttpException Errors That Reference eurl.axd" документа ASP.NET 4 Breaking Changes на веб-сайте ASP.NET.

Типы членства

Некоторые типы (например, System.Web.Security.MembershipProvider), используемые в членстве ASP.NET, перемещены из сборки System.Web.dll в сборку System.Web.ApplicationServices.dll. Типы были перемещены для устранения проблемы зависимостей уровней архитектуры между типами в клиенте и в расширенных SKU платформы .NET Framework.

Библиотеки классов, обновленные с предыдущих версий ASP.NET и использующие перемещенные типы членства, могут не компилироваться при использовании в проекте ASP.NET 4. В этом случае добавьте в сборку System.Web.ApplicationServices.dll ссылку из проекта библиотеки классов.

Изменения в элементе управления Menu

Изменения, внесенные в элемент управления Menu, приводят к следующему поведению.

Мобильная сборка в файле web.config

В предыдущих версиях ASP.NET ссылка на сборку System.Web.Mobile.dll была включена в корневой файл web.config раздела assemblies в system.web/compilation. Для повышения производительности ссылка на эту сборку удалена.

ПримечаниеПримечание
Сборка System.Web.Mobile.dll и мобильные элементы управления ASP.NET включены в ASP.NET 4, но использовать их не рекомендуется.

Если требуется использовать типы из этой сборки, добавьте ссылку на нее в корневой файл web.config или в файл web.config приложения.

Кэширование вывода

В ASP.NET 1.0 ошибка приводила к тому, что кэшированные страницы с параметром кэша вывода Location="ServerAndClient" создавали HTTP-заголовок Vary:* в ответе. Таким образом клиентские браузеры получали указание никогда не кэшировать такую страницу локально. В ASP.NET 1.1 был добавлен метод HttpCachePolicy.SetOmitVaryStar, который можно было вызвать для подавления заголовка Vary:*. Однако отчеты об ошибках позволяют предположить, что разработчики не знают о поведении метода SetOmitVaryStar.

В ASP.NET 4 HTTP-заголовок Vary:* больше не создается для ответов, задающих следующую директиву.

<%@ OutputCache Location="ServerAndClient" %>

Поэтому метод HttpCachePolicy.SetOmitVaryStar больше не требуется для подавления заголовка Vary:*. В приложениях, где атрибут Location имеет значение ServerAndClient, страницы будет можно кэшировать в браузере, не вызывая метод HttpCachePolicy.SetOmitVaryStar.

Если страницы в приложении должны создавать заголовок Vary:*, следует вызвать метод HttpResponse.AppendHeader, как показано в следующем примере.

HttpResponse.AppendHeader("Vary","*");

Также можно изменить значение атрибута Location кэширования вывода на Server.

Синтаксический анализ страниц

Средство синтаксического анализа веб-страниц ASP.NET (ASPX-файлов) и пользовательских элементов управления (ASCX-файлов) в ASP.NET 4 работает строже, чем в предыдущих версиях ASP.NET, и отмечает флагом недопустимости больше разметки, чем в предыдущих версиях.

Проанализируйте сообщения об ошибках, появляющиеся при прогоне страницы, и исправьте ошибки, возникающие из-за недопустимой разметки.

Типы Passport

Поддержка Passport, встроенная в ASP.NET 2.0, устарела и теперь не обеспечивается из-за изменений в службе Passport (теперь используется пакет SDK Live ID). Поэтому типы, связанные со службой Passport в пространстве имен System.Web.Security, теперь помечены атрибутом ObsoleteAttribute.

Измените код, использующий типы Passport в пространстве имен System.Web.Security (например System.Web.Security.PassportIdentity), так, чтобы в нем использовался Windows Live ID SDK.

Сведения PathInfo в свойстве FilePath

ASP.NET 4 уже не включает значение PathInfo в возвращаемые значения свойств, таких как HttpRequest.FilePath, HttpRequest.AppRelativeCurrentExecutionFilePath и HttpRequest.CurrentExecutionFilePath. Вместо этого сведения PathInfo доступны в свойстве HttpRequest.PathInfo. Рассмотрим следующий фрагмент URL.

/testapp/Action.mvc/SomeAction

В более ранних версиях ASP.NET свойства System.Web.HttpRequest имели бы следующие значения.

В ASP.NET 4 свойства System.Web.HttpRequest вместо этого будут иметь следующие значения.

Найдите места в коде, где для получения сведений о пути используются свойства класса System.Web.HttpRequest. Измените код так, чтобы он отражал изменение способа получения сведений о пути.

Проверка запросов

Чтобы улучшить проверку запросов, проверка запроса ASP.NET теперь вызывается раньше в жизненном цикле запроса. В результате проверка запросов выполняется для запросов, предназначенных не для ASPX-файлов, а, например, для вызовов веб-служб и для пользовательских обработчиков. Проверка запросов также будет активна при выполнении пользовательских HTTP-модулей в конвейере обработки запросов.

В результате этого изменения запросы ресурсов, отличных от ASPX-файлов, могут приводить к ошибкам проверки запросов. Выполнение пользовательского кода в конвейере запросов (например пользовательских HTTP-модулей) также может приводить к ошибкам проверки запросов.

Если необходимо, чтобы проверка запроса выполнялась только для ASPX-страниц, можно вернуться к старому поведению, задав в файле веб-конфигурации следующий параметр.

<httpRuntime requestValidationMode="2.0" />

Примечание о безопасностиПримечание по безопасности
В случае возврата к старому поведению убедитесь, что весь код в существующих обработчиках и модулях, а также другой пользовательский код выполняет проверки на предмет потенциально опасных входных данных HTTP, которыми могут быть основные направления атак XSS.

Маршрутизация

Если создается веб-сайт на базе файловой системы в Visual Studio 2010 и он находится в папке, в имени которой есть точка (.), URL-маршрутизация не будет работать надежно. От некоторых виртуальных путей будет возвращаться ошибка HTTP 404. Причина в том, что Visual Studio 2010 запускает сервер разработки Visual Studio (Cassini), используя неправильный путь для корневого виртуального каталога.

  • На странице Свойства веб-сайта на базе файловой системы измените значение атрибута Виртуальный путь на "/".

    – или –

  • Создайте проект веб-приложения вместо проекта веб-сайта. В проектах веб-приложений данной проблемы не существует, и URL-маршрутизация работает, даже если в имени папки проекта есть точка.

    – или –

  • Создайте веб-сайт на базе HTTP, размещенный в IIS. Веб-сайты, размещенные в IIS, могут содержать точки в виртуальном пути и в имени папки файла проекта.

Сайты SharePoint

При попытке запустить веб-сайт ASP.NET 4, развернутый как дочерний элемент веб-сайта SharePoint, который содержит настраиваемый уровень частичного доверия с именем WSS_Minimal, появляется следующее сообщение об ошибке:

Could not find permission set named 'ASP.Net'.

В настоящее время нет версий SharePoint, совместимых с ASP.NET. Поэтому не следует пытаться запустить веб-сайт ASP.NET 4 как дочерний элемент веб-сайта SharePoint.

Стандарты XHTML 1.1

Чтобы обеспечить соответствие стандартам XHTML 1.1 для новых веб-сайтов, элементы управления ASP.NET в .NET Framework 4 создают HTML-код, соответствующий XHTML 1.1. Такая визуализация включается следующим параметром в файле web.config:

<system.Web>

<pages controlRenderingCompatibilityVersion="4.0"/>

</system.Web>

По умолчанию параметр имеет значение 4.0. В веб-проектах, обновленных до Visual Studio от Visual Studio 2008, этот параметр будет иметь значение 3.5 для совместимости.

Нет.

К началу

Ядро

Общие возможности

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

CardSpace

Компонент Windows CardSpace больше не включается в платформу .NET Framework; он предоставляется отдельно.

Загрузите Windows CardSpace с сайта Microsoft Download Center.

Файлы конфигурации

Внесены коррекции в отношении доступа платформы .NET Framework к файлам конфигурации приложений.

Если файл конфигурации приложения имеет имя имя_приложения.config, переименуйте его в файл имя_приложения.exe.config. Например, переименуйте файл MyApp.config в файл MyApp.exe.config.

Компилятор кода C#

Классы Compiler, CompilerError и ErrorLevel, которые находились в пространстве имен Microsoft.CSharp, больше недоступны и их сборка (cscompmgd.dll) больше не включается в платформу .NET Framework.

Используйте класс CodeDomProvider и другие классы в пространстве имен System.CodeDom.Compiler. Дополнительные сведения см. в разделе Использование CodeDOM.

Размещение

(неуправляемый интерфейс API)

Чтобы улучшить возможности размещения, некоторые API активации размещения стали нерекомендуемыми. Функции внутрипроцессного параллельного выполнения позволяют приложению загружать и запускать несколько версий .NET Framework в одном процессе. Например, можно запускать приложения, которые загружают надстройки (или компоненты), созданные на основе .NET Framework 2.0 с пакетом обновления 1 (SP1) и .NET Framework 4, в одном и том же процессе. Более ранние компоненты продолжают использовать более раннюю версию платформы .NET Framework, а новые компоненты используют новую версию платформы .NET Framework.

Используйте конфигурацию, описанную в разделе Внутрипроцессное параллельное выполнение.

Новая модель безопасности

Политика управления доступом для кода отключена и заменена упрощенной моделью, как описано в документе Изменения системы безопасности в платформе .NET Framework 4.

Если ваши приложения зависят от управления доступом для кода, могут потребоваться изменения. Дополнительные сведения см. в разделе Совместимость политики разграничения доступа кода и ее миграция.

К началу

Дата и время

Пространство имен: System; сборка: mscorlib (в mscorlib.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Летнее время

Для соответствия системным часам временные свойства (такие как TimeZoneInfo.Local и DateTime.Now) теперь используют правила операционной системы вместо других данных .NET Framework для перехода на летнее время.

Нет.

Форматирование строк

Для обеспечения поддержки форматирования, учитывающего язык и региональные параметры, структура TimeSpan теперь содержит новые перегрузки методов ToString, Parse и TryParse, а также новые методы ParseExact и TryParseExact.

Нет.

К началу

Глобализация

Список новых нейтральных и специальных наборов языков и региональных параметров см. в разделе Новые возможности глобализации и локализации.

Пространство имен: System.Globalization; сборка: mscorlib (в mscorlib.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Имена языков и региональных параметров

Следующие изменения имен затрагивают немецкий, мальдивский и африканские языки и региональные параметры.

  • CurrencyEnglishName: имя валюты для немецкого (Швейцария) языка и региональных параметров (de-CH) изменилось с "sFr" на "Fr".

  • LongDatePattern: шаблон полной даты для языка и региональных параметров дивехи (Мальдивы) (dv-MV) изменился с "дд/мммм/гггг" на "дд/мм/гггг".

  • PMDesignator: обозначение времени после полудня для языка и региональных параметров африкаанс (Южно-Африканская Республика) (af-ZA) изменилось с "nm" на "PM".

Обратите внимание на изменения в именах языков и региональных параметров.

Параметр кода языка (LCID)

Для соответствия ожидаемому поведению в параметрах сервера автоматизации среда CLR больше не передает текущие язык и региональные параметры для параметра LCID неуправляемым приложениям на основе модели COM. Вместо этого для языка и региональных параметров передается 1033 (en-us).

Изменения необходимы только для собственных приложений, требующих заданного языка и региональных параметров.

Устаревшие типы языка и региональных параметров

Типы языка и региональных параметров FrameworkCultures и WindowsOnlyCultures теперь являются устаревшими.

Для обратной совместимости поле FrameworkCultures теперь возвращает нейтральные и определенные языки и региональные параметры, которые были включены в более ранние версии .NET Framework, а поле WindowsOnlyCultures теперь возвращает пустой список.

Используйте другие значения перечисления CultureTypes.

Извлечение языка и региональных параметров

Начиная с Windows 7, .NET Framework 4 извлекает информацию о языке и региональных параметрах из операционной системы, вместо того чтобы хранить эти данные у себя. Кроме того, .NET Framework синхронизирует с Windows данные о сортировке и регистре.

Нет.

Стандарты Юникод 5.1

Платформа .NET Framework теперь поддерживает все символы Юникода 5.1 (примерно 1400 символов добавлено). Добавленные символы включают в себя новые символы, стрелки, диакритические знаки, пунктуационные и математические символы, ККЯ-штрихи, идеографические символы, дополнительные числовые знаки языков малаялам и телугу, различные символы бирманской, латинской, арабской, греческой, монгольской и кириллической письменности. Следующие новые виды письменности поддерживаются в Юникоде 5.1: суданская, лепча, ол-чики, ваи, саураштра, кайях ли, реджангская, гурмухи, ория, тамильская, телугу, малаялам и тямская.

Нет.

К началу

Исключения

Пространства имен: System, System.Runtime.ExceptionServices; сборка: mscorlib (в mscorlib.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Исключения, касающиеся поврежденного состояния процесса

Среда CLR больше не передает обработчику исключений в управляемом коде исключения, касающиеся поврежденного состояния процесса.

Эти исключения указывают, что состояние процесса повреждено. Запускать приложение в этом состоянии не рекомендуется.

Дополнительные сведения см. в разделе HandleProcessCorruptedStateExceptionsAttribute и в записи Обработка исключений поврежденного состояния блога "Среда CLR вдоль и поперек".

Исключения ядра выполнения

Класс ExecutionEngineException теперь является устаревшим, так как перехватываемое исключение позволит продолжить выполнение нестабильного процесса. Данное изменение увеличивает предсказуемость и надежность в среде выполнения.

Используйте класс InvalidOperationException для обозначения состояния.

К началу

Отражение

Пространство имен: System.Reflection; сборка: mscorlib (в mscorlib.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Алгоритмы хэширования для сборок

Свойство AssemblyName.HashAlgorithm теперь возвращает AssemblyHashAlgorithm.None, так как среда выполнения не знает хэш-алгоритм сборки, на которую стоит ссылка, если сборка не загружена. (Это касается использования данного свойства в сборке, на которую указывает ссылка, например в сборке, возвращаемой методом Assembly.GetReferencedAssemblies.)

Нет.

Загрузка сборок

Для предотвращения избыточной загрузки сборок и сохранения виртуального адресного пространства среда CLR теперь загружает сборки, используя только функцию MapViewOfFile Win32. Также больше не вызывается функция LoadLibrary.

Данное изменение влияет на диагностические приложения следующим образом.

  • Коллекция ProcessModuleCollection больше не будет содержать какие-либо модули из библиотеки классов (DLL-файл), как после вызова Process.GetCurrentProcess().Modules.

  • Приложениям Win32, использующим функцию EnumProcessModules, не будут видны все управляемые модули в списке.

Нет.

Объявляющий тип

Свойство Type.DeclaringType теперь корректно возвращает значение NULL, если тип не имеет объявляющего типа.

Нет.

Делегаты

Делегат теперь создает исключение ArgumentNullException вместо исключения NullReferenceException при передаче значения NULL в конструктор делегата.

Убедитесь, что при обработке исключений перехватываются исключения ArgumentNullException.

Изменение местоположения глобального кэша сборок

Для сборок .NET Framework 4 глобальный кэш сборок перемещен из каталога Windows (%WINDIR%) в подкаталог Microsoft.Net (%WINDIR%\Microsoft.Net). Сборки более ранних версий остаются в старом каталоге.

Неуправляемое перечисление ASM_CACHE_FLAGS содержит новый флаг ASM_CACHE_ROOT_EX. Этот флаг получает местоположение кэша для сборок .NET Framework 4, которые могут быть получены функцией GetCachePath.

Нет, если приложения не используют явные пути к сборкам, что не рекомендуется.

Инструмент глобального кэша сборок

Инструмент Gacutil.exe (программа глобального кэша сборок) больше не поддерживает средство просмотра подключаемого модуля оболочки.

Нет.

Взаимодействие

Пространство имен: System.Runtime.InteropServices; сборка: mscorlib (в mscorlib.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Длина буфера

(неуправляемый интерфейс API)

Для сохранения памяти функциональность для параметра pBufferLengthOffset метода ICorProfilerInfo2::GetStringLayout изменена так, чтобы она соответствовала параметру pStringLengthOffset. Оба параметра теперь указывают на расположение смещения длины строки. Длина буфера удалена из представления строкового класса.

Измените части, зависящие от длины буфера.

JIT-отладка

Чтобы упростить регистрацию для JIT-отладки, отладчик .NET Framework теперь использует только раздел реестра AeDebug, управляющий поведением JIT-отладки для машинного кода. Это изменение имеет следующие последствия.

  • Теперь нельзя регистрировать два различных отладчика для управляемого и машинного кода.

  • Теперь нельзя автоматически запускать отладчик для неинтерактивного процесса, но можно предложить пользователю интерактивный процесс.

  • Если не удается запустить отладчик или нет зарегистрированного отладчика, который должен быть запущен, уведомление больше не выдается.

  • Политики автоматического запуска, зависящие от интерактивности приложения, больше не поддерживаются.

Скорректируйте операции отладки согласно требованиям.

Вызов неуправляемого кода

Чтобы улучшить производительность при взаимодействии с неуправляемым кодом, некорректные соглашения о вызовах в вызове неуправляемого кода теперь приводят к завершению приложения с ошибкой. В более ранних версиях слой маршалинга разрешал такие ошибки вверх по стеку.

Отладка приложений в Microsoft Visual Studio 2010 оповестит о таких ошибках, и вы сможете исправить их.

Если у вас есть двоичные файлы, которые невозможно обновить, можно включить элемент <NetFx40_PInvokeStackResilience> в файл конфигурации приложения, чтобы включить разрешение ошибок вызовов вверх по стеку, как в более ранних версиях. Однако это может повлиять на производительность приложения.

Удаленные интерфейсы

(неуправляемый интерфейс API)

Чтобы не вводить в заблуждение разработчиков, указанные ниже интерфейсы были удалены. Причина удаления в том, что они не предоставляли никаких полезных сценариев времени выполнения и среда CLR не обеспечивала и не принимала никаких реализаций.

  • INativeImageINativeImageDependency

  • INativeImageInstallInfo

  • INativeImageEvaluate

  • INativeImageConverter

  • ICorModule

  • IMetaDataConverter

Нет.

К началу

Данные

В этом разделе описаны проблемы с миграцией при использовании наборов данных и клиентов SQL, Entity Framework, LINQ to SQL и серверов данных WCF (ранее называвшихся серверами данных ADO.NET).

DataSet и клиент SQL

В следующей таблице описаны усовершенствования функций, с которыми ранее были связаны ограничения или другие проблемы.

Пространства имен: System.Data, System.Data.Objects.DataClasses, System.Data.SqlClient; сборки: System.Data (в System.Data.dll), System.Data.Entity (в System.Data.Entity.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Сценарии POCO

Для более удобного использования в сценариях POCO (Plain Old CLR Object) интерфейс System.Data.Objects.DataClasses.IRelatedEnd теперь имеет новые методы. Эти новые методы принимают объект Object вместо сущности IEntityWithRelationships как параметр.

Редактирование строк

Метод IndexOf, реализованный классом DataView, теперь правильно возвращает значение редактируемой строки, а не значение "-1".

События

Событие DataRowView.PropertyChanged теперь вызывается, когда строка находится в измененном состоянии и вызван метод RejectChanges. Благодаря этому изменению стало проще создавать элементы управления пользовательского интерфейса, предоставляющие содержимое объекта DataSet.

Исключения

Когда подключение не установлено или не открыто, метод Prepare теперь вызывает исключение InvalidOperationException вместо исключения NullReferenceException.

Сопоставление представлений

Ошибки сопоставления представлений запросов теперь перехватываются во время разработки, во время выполнения теперь не создается исключение NullReferenceException.

Проверка сопоставления теперь перехватывает ошибку, когда два набора ассоциаций в концептуальной схеме (CSDL) сопоставлены с одним столбцом.

Транзакции

Если приложение попытается выполнить действие над подключением после завершения транзакции (в том числе прерванной транзакции или отката), будет создано исключение InvalidOperationException. Более ранние версии не создавали исключение и позволяли выполнять дополнительные команды, даже если транзакция была прервана.

К началу

Entity Framework

В следующей таблице описаны усовершенствования функций, с которыми ранее были связаны ограничения или другие проблемы.

Пространство имен: System.Data, System.Data.Objects, System.Data.Objects.DataClasses; сборка: System.Data.Entity (в System.Data.Entity.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Объекты сущностей

Установлена равнозначность между методом ObjectContext.Detach и состоянием объекта сущности при вызове метода ObjectContext.SaveChanges. Повышение целостности предотвращает возникновение неожиданных исключений.

Entity SQL

Улучшены правила разрешения идентификаторов в Entity SQL.

Средство синтаксического анализа Entity SQL теперь имеет улучшенную логику для разрешения составных идентификаторов.

Структурные заметки

Entity Framework теперь распознает структурные заметки.

Запросы

Следующие усовершенствования коснулись запросов.

  • Запрос GroupBy с использованием ключа NULL на пустой коллекции не приведет к возврату каких-либо строк, независимо от наличия в запросе дополнительные указаний.

  • Созданный SQL в запросах LINQ и Entity-SQL теперь по умолчанию рассматривает строковые параметры как значения, не принадлежащие кодировке Юникод.

К началу

Запросы из LINQ в SQL

В следующей таблице описаны усовершенствования функций, с которыми ранее были связаны ограничения или другие проблемы.

Пространство имен: System.Data.Linq; сборка: System.Data.Linq (в System.Data.Linq.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

События

Коллекция System.Data.Linq.EntitySet<TEntity> теперь вызывает событие ListChanged для операций добавления и удаления, не только когда коллекция загружена, но и когда коллекция EntitySet<TEntity> не загружена.

Запросы

Skip(0) больше не игнорируется в запросах LINQ to SQL. В результате запросы, у которых есть этот метод, могут вести себя по-другому. Например, в некоторых случаях требуется предложение OrderBy со Skip(0) и, если предложение OrderBy не было включено, запрос теперь будет вызывать исключение NotSupportedException.

К началу

Службы данных WCF

В следующей таблице описаны усовершенствования функций, с которыми ранее были связаны ограничения или другие проблемы.

Пространства имен: System.Data.Services, System.Data.Services.Client, System.Data.Services.Common, System.Data.Services.Providers; сборки: System.Data.Services (в System.Data.Services.dll), System.Data.Services.Client (в System.Data.Services.Client.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Пакетное двоичное содержимое

Службы данных WCF теперь поддерживают пакетированное двоичное содержимое в запросах и ответах.

Перехватчики изменений

Перехватчики изменений теперь выполняются для запроса на удаление.

Перехватчик изменений — это метод, выполняемый каждый раз, когда сервер получает запрос на изменение сущности в наборе сущностей. Он выполняется до выполнения входящего запроса. Перехватчик изменений предоставляет доступ к изменяемой сущности и выполняемой операции.

Исключения

Следующие условия теперь вызывают больше полезных исключений вместо исключения NullReferenceException.

  • При истечении времени ожидания для вызова службы данных возникает исключение TimeoutException.

  • При неправильном запросе службы данных вызывается исключение DataServiceRequestException.

Измените в приложениях обработку исключений, чтобы новые исключения перехватывались.

Заголовки

Следующие улучшения коснулись заголовков.

  • Службы данных WCF теперь корректно отвергают заголовок eTag с незаданным значением.

  • Службы данных WCF теперь возвращают ошибку и не выполняют запрос на удаление запроса на ссылку, если в запросе есть заголовок if-*.

  • Службы данных WCF теперь возвращают клиенту ошибку в формате (Atom, JSON), который клиент указал в заголовке Accept.

Читатель JSON

Читатель JSON (JavaScript Object Notation — нотация объектов JavaScript) теперь корректно возвращает ошибку при чтении одиночного escape-символа обратной косой черты (\) во время обработки полезных нагрузок JSON, отправленных службе данных WCF.

Слияния

Следующие усовершенствования сделаны в перечислении MergeOption.

  • Параметр слияния AppendOnly больше не изменяет сущность на клиенте в результате последующего ответа службы данных.

  • Параметр PreserveChanges теперь согласован между динамическим SQL и обновлениями на основе хранимых процедур.

Запросы

Метод DataService<T>.OnStartProcessingRequest теперь вызывается перед обработкой запроса, обращенного к службам данных. Это позволяет обеспечить правильную работу запроса для служб ServiceOperation.

Потоки

Службы данных WCF больше не закрывают базовый поток для операций чтения и записи.

URI

Экранирование спецсимволов в URI клиентом служб данных WCF исправлено.

Windows Communication Foundation (WCF)

В следующей таблице описаны усовершенствования функций, с которыми ранее были связаны ограничения или другие проблемы.

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Файлы конфигурации

Чтобы обеспечить наследование поведения в иерархии файлов конфигурации, WCF теперь поддерживает слияние по нескольким файлам конфигурации.

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

Могут произойти изменения поведения, если есть несколько вариантов поведения с одинаковыми именами на различных уровнях иерархии.

Размещение службы

Элемент конфигурации <serviceHostingEnvironment> больше нельзя задавать на уровне службы, добавляя атрибут allowDefinition="MachineToApplication" в определение элемента.

Задание элемента <serviceHostingEnvironment> на уровне службы технически некорректно и приводит к нарушению целостности поведения.

К началу

Windows Presentation Foundation (WPF)

Приложения

Пространства имен: System.Windows, System.Windows.Controls; сборка: PresentationFramework (в PresentationFramework.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Обработка исключений

Чтобы как можно раньше обнаруживать ошибки, WPF создает исключение TargetInvocationException и задает свойство InnerException для критических исключений, таких как NullReferenceException, OutOfMemoryException, StackOverflowException и SecurityException, вместо того чтобы перехватывать исходное исключение.

Нет.

Связанные ресурсы

Чтобы облегчить связывание, файлы ресурсов (например изображения), расположенные не в структуре папки проекта, используют как идентификатор файла полный путь к файлу ресурсов вместо простого имени файла. Приложение будет иметь возможность найти эти файлы во время выполнения.

Нет.

Приложения с частичным доверием

По соображениям безопасности приложения на основе Windows, использующие частичное доверие и содержащие элемент управления WebBrowser или элемент управления Frame, который содержит HTML, вызывают исключение SecurityException при создании элемента управления.

Приложения браузера будут вызывать исключение и отображать сообщение, если выполняются все следующие условия:

  • приложение работает в Firefox;

  • приложение запускается в режиме частичного доверия в зоне Интернета с ненадежных сайтов;

  • в приложении имеется элемент управления WebBrowser или Frame, содержащий HTML

Следует отметить, что это не относится к приложениям, запускаемым с надежных сайтов или из зоны интрасети.

В приложениях браузера можно смягчить последствия данного изменения, выполнив одно из следующих действий:

  • запускать приложение в режиме полного доверия;

  • добиться, чтобы клиенты добавили сайт приложения в зону надежных сайтов;

  • добиться, чтобы клиенты запускали приложение в Internet Explorer.

Словари ресурсов

Чтобы улучшить словари ресурсов на уровне темы и предотвратить их изменение, замораживаемые ресурсы, определенные в словаре ресурсов и слитые в словарь на уровне темы, теперь всегда помечаются как замороженные и не могут изменяться. Это ожидаемое поведение для замораживаемых ресурсов.

Приложения, изменяющие ресурс, определенный в слитом словаре на уровне темы, должны клонировать ресурс и изменять копию. Также можно пометить ресурс значением x:Shared="false", чтобы словарь ResourceDictionary создавал новую копию каждый раз, когда ресурс запрашивается.

Windows 7

Чтобы приложения WPF лучше работали в Windows 7, следующие изменения были сделаны для исправления поведения окна.

  • Состояния закрепления и жестов теперь работают предсказуемо, в соответствии с действиями пользователей.

  • Команды панели задач Окна каскадом, Отображать окна стопкой и Отображать окна рядом теперь дают правильный результат и обновляют соответствующие свойства.

  • Свойства Top, Left, Width и Height для открытого во весь экран или свернутого окна теперь содержат правильные данные о расположении для восстановления окна, в зависимости от монитора.

Нет.

Стиль и прозрачность Windows

Создается исключение InvalidOperationException при попытке задать для свойства WindowStyle значение, отличное от None, если свойство AllowsTransparency имеет значение true, а WindowState имеет значение Minimized.

Если требуется изменить значение свойства WindowStyle, когда свойство AllowsTransparency имеет значение true, можно вызвать функцию SetWindowLongPtr Win32.

Средство просмотра XPS

В WPF не входит пакет Microsoft XPS EP (XPSEP). XPSEP включается в Windows 7 и Windows Vista.

На компьютере под управлением Windows XP, где не выполнена установка .NET Framework 3.5 с пакетом обновления 1 (SP1), печать с помощью интерфейса API WPF, отличного от того, что используется в PrintDialog, будет зависеть от WINSPOOL. Не будет сообщено о некоторых возможностях принтера, и некоторые параметры принтера не будут применяться во время печати.

При необходимости установите пакет Microsoft XML Paper Specification Essentials Pack.

К началу

Элементы управления

Пространства имен: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input; сборки: PresentationFramework (в PresentationFramework.dll), PresentationCore (в PresentationCore.dll), WindowsBase (в WindowsBase.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Диалоговые окна

Для увеличения надежности метод CommonDialog.ShowDialog вызывается в том же потоке, где был создан элемент управления Microsoft.Win32.FileDialog.

Проверьте, что элемент управления FileDialog создан в том же потоке, где вызывается метод ShowDialog.

Плавающие окна

Чтобы исправить логику восстановления фокуса, которая приводит к ошибочной повторной активации плавающего окна (в результате окно появляется как модальное диалоговое окно), восстановление фокуса теперь не выполняется, если объект не является дочерним объектом окна.

Нет.

Элементы коллекций

Когда элемент перемещается или добавляется в базовую коллекцию, он появляется в представлении CollectionView в том же относительном расположении, как если бы представление CollectionView не упорядочивалось. Это обеспечивает согласованность между расположением элемента в коллекции и в связанном представлении CollectionView.

Используйте метод ItemContainerGenerator.ContainerFromItem или метод CollectionView.IndexOf для поиска расположения элемента в объекте CollectionView, вместо того чтобы полагаться на фиксированное расположение элемента.

Макеты

Чтобы избежать ненужного повторного создания макетов, изменение свойства Page.ShowsNavigationUI больше не делает макет недействительным и не вызывает передачу другого макета.

Если вы предполагаете, что изменение свойства ShowsNavigationUI приведет к передаче другого макета, вызовите метод UIElement.InvalidateVisual после задания этого свойства.

Меню

Чтобы ClearType могла использоваться во всплывающем окне меню, внесены изменения в класс ControlTemplate и в элемент управления MenuItem, а также в другие элементы управления.

Приложения не должны опираться на визуальную структуру шаблонов элементов управления. Частью общего контракта являются только именованные части шаблона ControlTemplate. Если приложение должно найти конкретный объект в шаблоне ControlTemplate, следует выполнять поиск по визуальному дереву, а не полагаться на фиксированное расположение объекта в дереве.

Навигация

Если объект Frame непосредственно переходит в расположение, свойство IsNavigationInitiator принимает значение true после первого перехода. Это изменение предотвращает возникновение дополнительных событий при выполнении сценариев запуска.

Нет.

Всплывающие окна

Теперь делегат CustomPopupPlacementCallback во время передачи макета может вызываться не один раз, а несколько.

Если делегат CustomPopupPlacementCallback рассчитывает положение объекта Popup на основе его предыдущего расположения, значение должно пересчитываться только в том случае, если изменились параметры popupSize, targetSize или offset.

Значения свойства

Метод DependencyObject.SetCurrentValue теперь позволяет задать для свойства действующее значение, хотя он продолжает учитывать привязки, стиль или триггер, влияющие на свойство.

Создатели элементов управления должны использовать метод SetCurrentValue, всякий раз когда значение свойства изменяется в результате побочного эффекта какого-либо другого действия, в том числе манипуляции пользователя.

Текстовые поля

По соображениям безопасности методы TextBoxBase.Copy и TextBoxBase.Cut завершаются с ошибкой без оповещения при вызове с частичным доверием.

Кроме того, программное выполнение свойств ApplicationCommands.Copy или ApplicationCommands.Cut для элемента управления, наследующего от класса TextBoxBase, будет блокировано при частичном доверии. Однако вызванные пользователем команды копирования и вырезания, например нажатие кнопки, свойство ButtonBase.Command которой привязано к одной из этих команд, будут работать. Стандартное копирование и вырезание с помощью сочетания клавиш или контекстного меню будет работать, как до введения режима частичного доверия.

Свяжите команды ApplicationCommands.Copy или ApplicationCommands.Cut с действием, инициированным пользователем, например нажатием кнопки.

К началу

Графика

Пространства имен: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input, System.Windows.Media.Effects; сборки: PresentationFramework (в PresentationFramework.dll), PresentationCore (в PresentationCore.dll), WindowsBase (в WindowsBase.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Эффекты для точечных рисунков

В целях повышения производительности класс BitmapEffect и классы, наследующие от класса BitmapEffect, отключены, хотя формально присутствуют. Эффект будет отображен с помощью аппаратно ускоренного конвейера визуализации, если выполняются следующие условия:

  • приложение использует DropShadowBitmapEffect или BlurBitmapEffect со свойством радиуса, установленным в значение менее 100 DIU;

  • видеоадаптер компьютера, на котором работает приложение, поддерживает построитель текстуры 2.0.

Если перечисленные условия не удовлетворяются, объект BitmapEffect не произведет какого-либо действия.

Также Visual Studio 2010 создаст предупреждение компилятора при обнаружении объекта BitmapEffect или его подкласса.

Метод PushEffect помечен как устаревший.

Прекратите использование устаревшего класса BitmapEffect и его производных классов и воспользуйтесь новыми классами, производными от Effect: BlurEffect, DropShadowEffect и ShaderEffect.

Также вы можете создавать собственные эффекты, наследуя от класса ShaderEffect.

Кадры растрового изображения

Клонированные объекты BitmapFrame теперь получают события DownloadProgress, DownloadCompleted и DownloadFailed. Это обеспечивает корректную работу для изображений, загружаемых из Интернета и применяемых к элементу управления Image с помощью класса Style.

Изменение поведения будет заметно только в том случае. если все следующие утверждения истинны:

Проверьте отправителя в обработчике событий и выполните действие, только если отправителем является исходный объект BitmapFrame.

Декодирование изображений

Чтобы обеспечить обязательную обработку исключения IOException при невозможности декодировать изображение, класс BitmapSource создает событие DecodeFailed, когда не удается декодировать изображение.

Удалите обработку исключений для IOException и используйте событие DecodeFailed для обнаружения ошибок при декодировании.

К началу

Ввод

Пространства имен: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input; сборки: PresentationFramework (в PresentationFramework.dll), PresentationCore (в PresentationCore.dll), WindowsBase (в WindowsBase.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Привязка экземпляров команд

Чтобы предоставить механизм привязки экземпляров команд на основе модели представления к действиям ввода на основе представления, класс InputBinding теперь наследует от класса Freezable вместо класса DependencyObject. Следующие свойства теперь являются свойствами зависимостей.

Это изменение имеет следующие последствия.

  • Объект InputBinding теперь замораживается после регистрации, вместо того чтобы оставаться неизменяемым.

  • Отсутствует доступ к объектам InputBinding на уровне экземпляра из нескольких потоков в связи с ограничениями класса DependencyObject.

  • Нельзя изменять привязки ввода на уровне класса после их регистрации в связи с ограничениями класса Freezable.

  • Нельзя задавать привязки ввода для экземпляров команд, созданных в модели представления.

Создайте отдельные экземпляры класса InputBinding в отдельных потоках, если привязки должны быть изменяемыми, или заморозьте их в противном случае. Не изменяйте статическую привязку InputBinding уровня класса после того, как она зарегистрирована.

Приложения браузера

WPF-приложения браузера (.XBAP) теперь обрабатывают ключевые события как отдельные приложения WPF, поэтому объекты получают перенаправляемые ключевые события в правильном порядке.

Нет.

Мертвые сочетания клавиш

WPF не показывает мертвые клавиши, которые не производят видимых символов, но указывает, что для создания символа эту клавишу следует нажать вместе со следующей буквенной клавишей. События ввода с клавиатуры, например событие KeyDown, сообщают, когда клавиша является мертвой, задавая для свойства Key значение DeadCharProcessed. Это ожидаемое поведение, поскольку приложения обычно не предназначены для ответа на ввод с клавиатуры, создающий комбинированный символ.

Приложения, которые должны считывать клавиши, бывшие частью комбинированных символов, могут получить "невидимую" клавишу, используя свойство DeadCharProcessedKey.

Диспетчер фокуса

Когда в метод FocusManager.GetFocusedElement передается элемент, имеющий присоединенное свойство IsFocusScope со значением true, этот метод возвращает последний элемент, на котором находился фокус клавиатуры в рамках области этого фокуса, тогда и только тогда, когда возвращаемый элемент принадлежит тому же объекту PresentationSource, что и элемент, переданный в метод.

Нет.

К началу

Модель автоматизации пользовательского интерфейса

Пространство имен: System.Windows, System.Windows.Automation.Peers, System.Windows.Automation.Provider, System.Windows.Controls, System.Windows.Data, System.Windows.Input; сборки: PresentationFramework (в PresentationFramework.dll), PresentationCore (в PresentationCore.dll), UIAutomationProvider (в UIAutomationProvider.dll), WindowsBase (в WindowsBase.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Иерархия классов представлений

Классы TreeViewAutomationPeer и TreeViewItemAutomationPeer наследуют от ItemsControlAutomationPeer, а не от FrameworkElementAutomationPeer.

Если наследование производится от классов TreeViewItemAutomationPeer и метод GetChildrenCore переопределяется, рассмотрите возможность возврата объекта, который наследует от нового класса TreeViewDataItemAutomationPeer.

Контейнеры вне экрана

Исправляется неправильное возвращаемое значение, метод UIElementAutomationPeer.IsOffscreenCore теперь корректно возвращает значение false для контейнеров элементов, которые находятся вне области видимости. Кроме того, на значение метода не влияют помехи со стороны других окон или видимость элемента на отдельном мониторе.

Нет.

Меню и дочерние объекты

Чтобы обеспечить автоматизацию пользовательского интерфейса для меню, содержащих дочерние объекты, отличные от объектов MenuItem, метод GetChildrenCore теперь возвращает объект AutomationPeer дочернего объекта UIElement вместо объекта MenuItemAutomationPeer.

Нет.

Новые интерфейсы и сборка

Для обеспечения работы новых функций модели автоматизации пользовательского интерфейса были добавлены следующие интерфейсы.

В любой проект, в котором выполняется построение одноранговых классов автоматизации WPF, должна быть добавлена явная ссылка на файл UIAutomationProvider.dll.

Элементы управления Thumb

Метод GetClassNameCore возвращает значение вместо NULL. Поэтому такие производные от класса Thumb элементы управления, как GridSplitter, будут передавать имя в модель автоматизации пользовательского интерфейса.

Нет.

Виртуальные элементы

Для повышения производительности метод UIElementAutomationPeer.GetChildrenCore возвращает только дочерние объекты, реально присутствующие в дереве представления, вместо всех дочерних объектов, независимо от того, являются ли они виртуальными.

Используйте класс ItemContainerPattern для перебора всех элементов объекта ItemsControlAutomationPeer.

К началу

XAML

Пространства имен: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input, System.Windows.Markup; сборки: PresentationFramework (в PresentationFramework.dll), PresentationCore (в PresentationCore.dll), WindowsBase (в WindowsBase.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Рекомендованные изменения

Расширение разметки

WPF теперь всегда правильно использует значение из метода MarkupExtension.ProvideValue вместо возврата объекта MarkupExtension в некоторых случаях, когда расширение разметки используется для задания свойства или для создания элемента в коллекции. В некоторых случаях расширение разметки может возвращать само себя.

Если ваше приложение обращается к ресурсу, возвращавшему в более ранних версиях объект MarkupExtension, создайте ссылку на объект, возвращаемый из метода ProvideValue вместо объекта MarkupExtension.

Анализ атрибутов

Атрибуты в языке XAML теперь могут иметь только одну точку. Примеры допустимых строк.

<Button Background="Red"/> (точек нет)

<Button Button.Background = "Red"/> (одна точка)

Пример ставшей недопустимой строки.

<Button Control.Button.Background = "Red"/> (более одной точки)

Исправьте атрибуты XAML, содержащие более одной точки.

К началу

XML

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

Схема и преобразования

Пространства имен: System.Xml.Linq; System.Xml.Schema, System.Xml.XPath; сборки: System.Xml (в System.Xml.dll), System.Xml.Linq (в System.Xml.Linq.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Схемы-хамелеоны

Чтобы предотвратить повреждение данных, схемы-хамелеоны теперь правильно клонируются, когда добавляются с несколькими схемами.

Схемы-хамелеоны — это схемы, не имеющие целевого пространства имен. Когда они включаются в другой XSD-файл, они принимают целевое пространство имен схемы, в которую они импортируются. Часто они используются для включения в схему распространенных типов.

Функции ID

Функция id function XSLT теперь возвращает корректное значение вместо NULL при передаче объекта XmlReader в XLST.

Если пользователь создавал объект XmlReader из класса LINQ to XML с помощью метода CreateReader и этот объект XmlReader был передан в XSLT, все экземпляры функции id в XSLT ранее возвращали NULL. Для функции id это не является разрешенным возвращаемым значением.

Атрибут пространства имен

Во избежание повреждения данных объект XPathNavigator теперь возвращает локальное имя атрибута x:xmlns правильно.

Объявления пространств имен

Объект XmlReader в поддереве больше не создает дублирующиеся объявления пространства имен в одном XML-элементе.

Проверка схемы

Чтобы избежать ошибочной проверки схемы, класс XmlSchemaSet позволяет, чтобы XSD-схемы были скомпилированы корректно и непротиворечиво. Схемы могут включать в себя другие схемы. Например, A.xsd может включать B.xsd, которая может включать C.xsd. Компиляция любой из указанных схем приводит к обходу данного графа зависимостей.

Функции скрипта

Функция function-available function больше не повторяет ошибочный возврат значения false, когда функция на самом деле доступна.

URI

Метод XElement.Load теперь возвращает правильный BaseURI в запросах LINQ.

К началу

Проверка

Пространства имен: System.Xml.Linq; System.Xml.Schema, System.Xml.XPath; сборки: System.Xml (в System.Xml.dll), System.Xml.Linq (в System.Xml.Linq.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Распознаватели пространств имен

Метод XmlReader.ReadContentAs больше не игнорирует переданный ему распознаватель IXmlNamespaceResolver.

В более ранних версиях заданный распознаватель пространств имен игнорировался, вместо него использовался XmlReader.

Пробел

Для предотвращения потери данных при создании средства чтения метод XmlReader.Create больше не отбрасывает имеющий значение пробел.

Проверка XML распознает режим смешанного содержимого, когда текст может идти вперемешку с XML-разметкой. В смешанном режиме все пробелы являются значимыми и должны приниматься во внимание.

К началу

Запись

Пространства имен: System.Xml.Linq; System.Xml.Schema, System.Xml.XPath; сборки: System.Xml (в System.Xml.dll), System.Xml.Linq (в System.Xml.Linq.dll)

Функция

Отличия от версии 3.5 с пакетом обновления 1 (SP1)

Ссылки на сущности

Во избежание повреждения данных ссылки на сущности больше не преобразуются дважды в атрибутах XML.

Если пользователь пытался записать сущность в атрибут xmlns или в атрибуты xml:lang или xml:space с помощью метода WriteEntityRef, на выходе сущность преобразовывалась дважды, что приводило к повреждению данных.

Обработка новых строк

Во избежание повреждения данных объекты XmlWriter учитывают параметр None.

К началу

См. также

Основные понятия

Новые возможности .NET Framework 4

Перенос решений Office на платформу .NET Framework 4

Другие ресурсы

Руководство по миграции на .NET Framework 4

Совместимость версий в .NET Framework

Устаревшие возможности .NET Framework

Новые типы и члены в .NET Framework 4

Migration Issues for .NET Framework 4 Applications: Beta 2 to RTM

Журнал изменений

Дата

Журнал

Причина

Август 2010

Добавлено описание проблем, касающихся элементов управления размещением в веб-браузере, классов компилятора и CodeDOM, а также средства просмотра глобального кэша сборок.

Улучшение информации.