Поделиться через


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

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

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

Сведения о новых возможностях см. в статье Новые возможности .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.Browse страницы) управляется файлами описания браузеров. Поэтому информация, возвращаемая при обращении к свойству этого объекта в ASP.NET 4, может отличаться от информации, возвращаемой в более ранней версии ASP.NET.
Если в вашем приложении используются старые файлы описания браузеров, их можно скопировать из следующей папки:

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

Скопируйте файлы в соответствующую папку \CONFIG\Browsers для ASP.NET 4. После копирования файлов запустите программу командной строки Aspnet_regbrowsers.exe. Дополнительные сведения см. на веб-сайте https://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 не запускаются, если родительскими приложениями являются приложения ASP.NET 2.0 или ASP.NET 3.5") статьи ASP.NET 4 Breaking Changes ("Критические изменения в ASP.NET 4").
Изменения ClientID Новый параметр clientIDMode в ASP.NET 4 позволяет задать способ создания платформой ASP.NET атрибута id для HTML-элементов. В более ранних версиях ASP.NET поведение по умолчанию соответствовало значению AutoID параметра clientIDMode. Теперь значение по умолчанию — Predictable. Дополнительные сведения см. в разделе Идентификация элементов управления Web Forms. Если для обновления приложения с версии ASP.NET 2.0 или ASP.NET 3.5 используется Visual Studio, средство автоматически добавит в файл Web.config параметр, сохраняющий поведение предыдущих версий платформы .NET Framework. Однако если вы обновляете приложение путем изменения пула приложения в IIS, задавая .NET Framework 4 как целевую платформу, ASP.NET использует новый режим по умолчанию. Чтобы отключить новый режим идентификатора клиента, добавьте в файл 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. 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") статьи ASP.NET 4 Breaking Changes ("Критические изменения в ASP.NET 4").
Отрисовка элементов управления В более ранних версиях ASP.NET некоторые элементы управления создавали разметку, которую нельзя было отключить. В ASP.NET 4 по умолчанию такой тип разметки больше не создается. Изменения касаются перечисленных ниже элементов управления.

* Элементы управления Image и ImageButton больше не отрисовывают атрибут border="0".
* Класс BaseValidator и проверочные элементы управления, производные от него, по умолчанию больше не отрисовывают текст красного цвета.
* Элемент управления HtmlForm не отрисовывает атрибут name.
* Элемент управления Table больше не отрисовывает атрибут border="0".

Элементы управления, не предназначенные для пользовательского ввода (например, элемент управления Label), больше не отрисовывают атрибут disabled="disabled", если свойство Enabled имеет значение false (или если этот параметр унаследован ими от контейнерного элемента управления).
Если вы используете Visual Studio для обновления своего приложения с версии 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 ("Обработчики событий могут не вызываться в документе по умолчанию в интегрированном режиме IIS 7 или IIS 7.5") статьи ASP.NET 4 Breaking Changes ("Критические изменения в ASP.NET 4").
Алгоритм хэширования 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 в Интернете Обозреватель, так как существуют лучшие решения для размещения элементов управления в Интернете. Поэтому сборки 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 2.0 могут вызывать ошибки HttpException, в которых указывается eurl.axd") статьи ASP.NET 4 Breaking Changes ("Критические изменения в ASP.NET 4").
Типы членства Некоторые типы (например, MembershipProvider), используемые в членстве ASP.NET, перемещены из сборки System.Web.dll в сборку System.Web.ApplicationServices.dll. Типы были перемещены для устранения проблемы зависимостей уровней архитектуры между типами в клиенте и в расширенных SKU платформы .NET Framework. Библиотеки классов, обновленные с предыдущих версий ASP.NET и использующие перемещенные типы членства, могут не компилироваться при использовании в проекте ASP.NET 4. В этом случае добавьте в сборку System.Web.ApplicationServices.dll ссылку из проекта библиотеки классов.
Изменения в элементе управления Menu Изменения, внесенные в элемент управления Menu, приводят к описанному ниже поведению.

* Если для MenuRenderingMode задано значение List или для MenuRenderingMode задано значение Default и для ControlRenderingCompatibilityVersion — значение 4.0 или выше, свойство PopOutImageUrl не действует.
* Если путь, заданный в StaticPopOutImageUrl свойствах, DynamicPopOutImageUrl содержит обратную косую черту (\), изображения не отображаются. (В предыдущих версиях ASP.NET путь мог содержать обратную косую черту.)
* Вместо задания свойства PopOutImageUrl для отдельных пунктов меню задайте свойство StaticPopOutImageUrl или DynamicPopOutImageUrl родительского элемента управления Menu.

–или–

Для MenuRenderingMode задайте значение Table либо для MenuRenderingMode задайте значение Default и для ControlRenderingCompatibilityVersion — значение 3.5. Эти параметры предписывают элементу управления Menu использовать структуру на основе таблицы HTML, которую он использовал в предыдущих версиях ASP.NET.
* Если путь в StaticPopOutImageUrl свойстве содержит DynamicPopOutImageUrl обратную косую черту (\), замените символ косой черты (/).
Мобильная сборка в файле 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" в качестве параметра кэша"кэша", чтобы вывести Vary:* заголовок HTTP в ответе. Таким образом, клиентские браузеры получали указание никогда не кэшировать такую страницу локально. В ASP.NET 1.1 был добавлен метод SetOmitVaryStar, который можно было вызвать для подавления заголовка Vary:*. Однако отчеты об ошибках позволяют предположить, что разработчики не знают о поведении метода SetOmitVaryStar.

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

<%@ OutputCache Location="ServerAndClient" %>

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

System.Web.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 (например, PassportIdentity), так, чтобы в нем использовался пакет SDK Windows Live ID.
Сведения PathInfo в свойстве FilePath ASP.NET 4 больше не включает значение PathInfo в возвращаемые значения таких свойств, как FilePath, AppRelativeCurrentExecutionFilePath и CurrentExecutionFilePath. Вместо этого сведения PathInfo доступны в свойстве PathInfo. Рассмотрим следующий фрагмент URL-адреса:

/testapp/Action.mvc/SomeAction

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

* FilePath: /testapp/Action.mvc/SomeAction
* PathInfo: (пусто)

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

* FilePath: /testapp/Action.mvc
* PathInfo: SomeAction
Найдите места в коде, где для получения сведений о пути используются свойства класса 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 Development Server, используя неправильный путь к корневому виртуальному каталогу. * На странице Свойства веб-сайта на базе файловой системы измените значение атрибута Виртуальный путь на "/".

–или–

* Создайте проект веб-приложения вместо проекта веб-сайта. В проектах веб-приложений такой проблемы не существует, и маршрутизация 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. Такая отрисовка включается следующим параметром в элементе <system.Web> файла Web.config:

<pages controlRenderingCompatibilityVersion="4.0"/>

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

Основные сведения

Общие компоненты

Функция Отличия от версии 3.5 с пакетом обновления 1 (SP1) Рекомендованные изменения
CardSpace Компонент Windows CardSpace больше не включается в платформу .NET Framework; он предоставляется отдельно. Скачайте Windows CardSpace из Центра загрузки Майкрософт.
Файлы конфигурации Внесены исправления в отношении доступа платформы .NET Framework к файлам конфигурации приложений. Если файл конфигурации приложения называется application-name.config, переименуйте его в application-name.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 4. Если ваши приложения зависят от управления доступом для кода, могут потребоваться изменения. Дополнительные сведения см. в разделе Совместимость политики разграничения доступа кода и ее миграция.

Дата и время

Пространство имен: System

Сборка: mscorlib (в mscorlib.dll)

Функция Отличия от версии 3.5 с пакетом обновления 1 (SP1) Рекомендованные изменения
Летнее время Для соответствия системным часам свойства времени (такие как Local и Now) теперь используют правила операционной системы вместо других данных .NET Framework для перехода на летнее время. Нет.
Форматирование строк Для поддержки форматирования, учитывающего язык и региональные параметры, структура TimeSpan содержит новые перегрузки методов ToString, Parse и TryParse, а также новые методы ParseExact и TryParseExact. Нет.

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

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

Пространство имен: System.Globalization

Сборка: mscorlib (в mscorlib.dll)

Функция Отличия от версии 3.5 с пакетом обновления 1 (SP1) Рекомендованные изменения
Имена языков и региональных параметров Перечисленные ниже изменения имен затрагивают немецкий, мальдивский и африканские языки и региональные параметры.

* CurrencyEnglishName: название валюты для немецкого языка (Швейцария) (de-CH) изменилось с "sFr".
* LongDatePattern: шаблон полной даты для мальдивского языка и региональных параметров (dv-MV) изменился с "дд/мммм/гггг" на "дд/мм/гггг".
* PMDesignator: Конструктор П.М. культуры Afrikaans (Южная Африка) (af-ZA) изменился с "nm" на "PM".
Обратите внимание на изменения в именах языков и региональных параметров.
Параметр кода языка (LCID) Для соответствия ожидаемому поведению в параметрах сервера автоматизации среда CLR больше не передает текущие язык и региональные параметры для параметра LCID в неуправляемые приложения на основе модели COM. Вместо этого для языка и региональных параметров передается 1033 (en-us). Изменения необходимы только для собственных приложений, требующих определенного языка и региональных параметров.
Устаревшие типы языка и региональных параметров Типы языка и региональных параметров CultureTypes и CultureTypes теперь являются устаревшими.

Для обратной совместимости поле CultureTypes теперь возвращает нейтральные и определенные языки и региональные параметры, которые были включены в более ранние версии .NET Framework, а поле CultureTypes теперь возвращает пустой список.
Используйте другие значения перечисления 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 и в записи Обработка исключений поврежденного состояния в журнале MSDN.
Исключения подсистемы выполнения Класс ExecutionEngineException теперь является устаревшим, так как перехватываемое исключение позволяет продолжать выполнение нестабильного процесса. Это изменение увеличивает предсказуемость и надежность в среде выполнения. Используйте класс InvalidOperationException для обозначения состояния.

Отражение

Пространство имен: System.Reflection

Сборка: mscorlib (в mscorlib.dll)

Функция Отличия от версии 3.5 с пакетом обновления 1 (SP1) Рекомендованные изменения
Хэш-алгоритмы для сборок Свойство HashAlgorithm теперь возвращает AssemblyHashAlgorithm, так как среда выполнения не знает хэш-алгоритма сборки, на которую указывает ссылка, если сборка не загружена. (Это касается использования данного свойства в сборке, на которую указывает ссылка, например в сборке, возвращаемой методом GetReferencedAssemblies.) Нет.
Загрузка сборок Для предотвращения избыточной загрузки сборок и сохранения виртуального адресного пространства среда CLR теперь загружает сборки, используя только функцию MapViewOfFile Win32. Кроме того, больше не вызывается функция LoadLibrary.

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

* Коллекция ProcessModuleCollection больше не будет содержать какие-либо модули из библиотеки классов (DLL-файла), как после вызова Process.GetCurrentProcess().Modules.
* Приложениям Win32, использующим функцию EnumProcessModules, не будут видны все управляемые модули в списке.
Нет.
Объявляющий тип Свойство 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 вы получите оповещения о таких ошибках и сможете исправить их.

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

* INativeImageINativeImageDependency
* INativeImageInstallInfo
* INativeImageEvaluate
* INativeImageConverter
* ICorModule
* IMetaDataConverter
Нет.

Data

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

Набор данных и клиент 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 интерфейс IRelatedEnd теперь имеет новые методы. Они принимают объект Object вместо сущности IEntityWithRelationships в качестве параметра.
Редактирование строк Метод IndexOf, реализованный классом DataView, теперь правильно возвращает значение редактируемой строки, а не значение –1.
События Событие 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)
Объекты сущностей Установлена равнозначность между методом Detach и состоянием объекта сущности при вызове метода SaveChanges. Повышение согласованности предотвращает возникновение неожиданных исключений.
Entity SQL Улучшены правила разрешения идентификаторов в Entity SQL.

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

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

LINQ to SQL

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

Пространство имен: System.Data.Linq

Сборка: System.Data.Linq (в System.Data.Linq.dll)

Функция Отличия от версии 3.5 с пакетом обновления 1 (SP1)
События Коллекция 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 Data Services теперь поддерживают пакетное двоичное содержимое в запросах и ответах.
Перехватчики изменений Перехватчики изменений теперь выполняются для запроса на удаление.

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

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

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

* Службы WCF Data Services теперь корректно отклоняют заголовок eTag, значение которого не задано.
* Службы WCF Data Services теперь возвращают ошибку и не выполняют запрос на удаление запроса на ссылку, если в запросе есть заголовок if-*.
* Службы WCF Data Services теперь возвращают клиенту ошибку в формате (Atom, JSON), который клиент указал в заголовке Accept.
Модуль чтения JSON Средство чтения объектов JavaScript (JSON) теперь правильно возвращает ошибку при чтении символа escape-косой черты ("\") при обработке полезных данных JSON, отправляемых в службу данных WCF.
Слияния Перечисления MergeOption коснулись перечисленные ниже усовершенствования.

* Параметр слияния MergeOption больше не изменяет сущность в клиенте в результате последующего ответа службы данных.
* Параметр MergeOption теперь согласован между динамическим SQL и обновлениями на основе хранимых процедур.
Запросы Метод OnStartProcessingRequest теперь вызывается перед обработкой запроса, обращенного к службам данных. Это позволяет обеспечить правильную работу запроса для служб ServiceOperation.
Потоки Службы WCF Data Services больше не закрывают базовый поток для операций чтения и записи.
Универсальные коды ресурсов (URI) Экранирование кодов URI клиентом служб WCF Data Services исправлено.

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.

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

* запускать приложение в режиме полного доверия;
* попросить клиентов добавить сайт приложения в зону надежных сайтов;
Словари ресурсов Чтобы улучшить словари ресурсов на уровне темы и предотвратить их изменение, фиксируемые ресурсы, определенные в словаре ресурсов и объединенные в словарь на уровне темы, теперь всегда помечаются как фиксированные и не могут изменяться. Это ожидаемое поведение для фиксируемых ресурсов. Приложения, изменяющие ресурс, определенный в объединенном словаре на уровне темы, должны клонировать ресурс и изменять копию. Кроме того, можно пометить ресурс как x:Shared="false", чтобы словарь ResourceDictionary создавал копию каждый раз, когда ресурс запрашивается.
Windows 7 Чтобы приложения WPF лучше работали в Windows 7, были внесены указанные ниже изменения для исправления поведения окна.

* Состояния закрепления и жестов теперь работают предсказуемо в соответствии с действиями пользователей.
* Команды панели задач Окна каскадом, Отображать окна стопкой и Отображать окна рядом теперь дают правильный результат и обновляют соответствующие свойства.
* Свойства Top, Left, Width и Height для открытого во весь экран или свернутого окна теперь содержат правильные сведения о расположении для восстановления окна в зависимости от монитора.
Нет.
Стиль и прозрачность Windows Исключение InvalidOperationException создается при попытке задать для свойства WindowStyle значение, отличное от WindowStyle, если свойство AllowsTransparency имеет значение true, а WindowState имеет значение WindowState. Если требуется изменить значение свойства WindowStyle, когда свойство AllowsTransparency имеет значение true, можно вызвать функцию SetWindowLongPtr Win32.
Средство просмотра XPS В WPF не входит пакет Microsoft XML Paper Specification Essentials Pack (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) Рекомендованные изменения
Диалоговые окна Для увеличения надежности метод ShowDialog вызывается в том же потоке, где был создан элемент управления FileDialog. Элемент управления FileDialog должен создаваться в том же потоке, где вызывается метод ShowDialog.
Плавающие окна Чтобы исправить логику восстановления фокуса, которая приводит к ошибочной повторной активации плавающего окна (в результате окно появляется как модальное диалоговое окно), восстановление фокуса теперь не выполняется, если объект не является дочерним объектом окна. Нет.
Элементы коллекции Когда элемент перемещается или добавляется в базовую коллекцию, он появляется в представлении CollectionView в том же относительном расположении, как если бы представление CollectionView не сортировалось. Это обеспечивает согласованность между расположением элемента в коллекции и в связанном представлении CollectionView. Используйте метод ContainerFromItem или IndexOf для поиска расположения элемента в объекте CollectionView, вместо того чтобы полагаться на фиксированное расположение элемента.
Макеты Чтобы избежать ненужного повторного создания макетов, изменение свойства ShowsNavigationUI больше не делает макет недействительным и не вызывает передачу другого макета. Если вы предполагаете, что изменение свойства ShowsNavigationUI приведет к передаче другого макета, вызовите метод InvalidateVisual после задания этого свойства.
Меню Чтобы текст ClearType мог использоваться во всплывающих меню, внесены изменения в класс ControlTemplate и в элемент управления MenuItem, а также в другие элементы управления. Приложения не должны опираться на визуальную структуру шаблонов элементов управления. Частью открытого контракта являются только именованные части шаблона ControlTemplate. Если приложение должно найти конкретный объект в шаблоне ControlTemplate, следует выполнять поиск по визуальному дереву, а не полагаться на фиксированное расположение объекта в дереве.
Навигация Если объект Frame непосредственно переходит в расположение, свойство IsNavigationInitiator принимает значение true после первого перехода. Это изменение предотвращает возникновение дополнительных событий при выполнении сценариев запуска. Нет.
Всплывающие окна Теперь во время передачи макета делегат CustomPopupPlacementCallback может вызываться не один раз, а несколько. Если делегат CustomPopupPlacementCallback рассчитывает положение объекта Popup на основе его предыдущего расположения, значение должно пересчитываться только в том случае, если изменились параметры popupSize, targetSize или offset.
Значения свойств Метод SetCurrentValue теперь позволяет задать для свойства действующее значение, хотя он продолжает учитывать привязку, стиль или триггер, влияющие на свойство. Создатели элементов управления должны использовать метод SetCurrentValue всякий раз, когда значение свойства изменяется в результате побочного эффекта какого-либо другого действия, в том числе операции пользователя.
Текстовые поля По соображениям безопасности методы Copy и Cut завершаются ошибкой без оповещения при вызове с частичным доверием.

Кроме того, программное выполнение свойства Copy или Cut для элемента управления, наследующего от класса TextBoxBase, будет блокировано при частичном доверии. Однако вызванные пользователем команды копирования и вырезания, например нажатие кнопки, свойство Command которой привязано к одной из этих команд, будут работать. Стандартное копирование и вырезание с помощью сочетания клавиш или контекстного меню будет работать как до введения режима частичного доверия.
Свяжите команды Copy или 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 создаст предупреждение компилятора при обнаружении объекта BitmapEffect или его подкласса.

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

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

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

* имеется подписка на событие DownloadProgress, DownloadCompleted или DownloadFailed;
* источником BitmapFrame является Интернет;
* объект BitmapFrame клонирован, когда скачивание еще выполняется.
Проверьте отправителя в обработчике событий и выполните действие, только если отправителем является исходный объект 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. Перечисленные ниже свойства теперь являются свойствами зависимостей.

* Command
* CommandParameter
* CommandTarget

Это изменение имеет указанные ниже последствия.

* Объект InputBinding теперь фиксируется после регистрации, вместо того чтобы оставаться изменяемым.
* Отсутствует доступ к объектам InputBinding на уровне экземпляра из нескольких потоков в связи с ограничениями класса DependencyObject.
* Нельзя изменять привязки ввода на уровне класса после их регистрации в связи с ограничениями класса Freezable.
* Нельзя задавать привязки ввода для экземпляров команд, созданных в модели представления.
Создайте отдельные экземпляры класса InputBinding в отдельных потоках, если привязки должны быть изменяемыми, или фиксируйте их в противном случае. Не изменяйте статическую привязку InputBinding уровня класса после того, как она зарегистрирована.
Приложения для браузеров WPF-приложения для браузера (XBAP) теперь обрабатывают ключевые события как отдельные приложения WPF, поэтому объекты получают перенаправляемые ключевые события в правильном порядке. Нет.
Неработающие сочетания клавиш WPF не показывает неработающие клавиши, которые не производят видимых символов, но указывает, что для создания символа эту клавишу следует нажать вместе со следующей буквенной клавишей. События ввода с клавиатуры, например событие KeyDownEvent, сообщают, когда клавиша является нерабочей, задавая для свойства Key значение Key. Как правило, это ожидаемое поведение, так как в приложениях обычно не предусмотрена реакция на ввод с клавиатуры, создающий комбинированный символ. Приложения, которые должны считывать клавиши, бывшие частью комбинированных символов, могут получить скрытую клавишу, используя свойство DeadCharProcessedKey.
Диспетчер фокуса Когда в метод FocusManager.GetFocusedElement(DependencyObject) передается элемент, имеющий присоединенное свойство 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.
Контейнеры вне экрана Для исправления неправильно возвращаемого значения метод IsOffscreenCore теперь корректно возвращает значение false для контейнеров элементов, которые при прокрутке находятся вне области видимости. Кроме того, на значение метода не влияют помехи со стороны других окон или видимость элемента на определенном мониторе. Нет.
Меню и дочерние объекты Чтобы обеспечить автоматизацию пользовательского интерфейса для меню, содержащих дочерние объекты, отличные от объектов MenuItem, метод GetChildrenCore теперь возвращает объект AutomationPeer дочернего объекта UIElement вместо объекта MenuItemAutomationPeer. Нет.
Новые интерфейсы и сборка Чтобы обеспечить работу новых функций автоматизации пользовательского интерфейса, были добавлены следующие интерфейсы:

* IItemContainerProvider
* ISynchronizedInputProvider
* IVirtualizedItemProvider
В любой проект, в котором выполняется сборка одноранговых классов автоматизации WPF, должна быть добавлена явная ссылка на файл UIAutomationProvider.dll.
Бегунки Метод GetClassNameCore возвращает значение вместо NULL. Поэтому такие элементы управления, как GridSplitter, наследующие от класса Thumb, будут передавать имя в модель автоматизации пользовательского интерфейса. Нет.
Виртуальные элементы Для повышения производительности метод 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 теперь всегда правильно использует значение из метода 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 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 больше не возвращает неправильное значение false, когда функция на самом деле доступна.
Универсальные коды ресурсов (URI) Метод 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)
Сопоставители пространств имен Метод ReadContentAs больше не игнорирует переданный ему сопоставитель IXmlNamespaceResolver.

В более ранних версиях указанный сопоставитель пространств имен игнорировался; вместо него использовался 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 учитывают параметр NewLineHandling.

См. также