Перенацеливание изменений для миграции на платформа .NET Framework 4.5.x

В этой статье перечислены проблемы совместимости приложений, представленные в платформа .NET Framework 4.5, 4.5.1 и 4.5.2.

.NET Framework 4.5

ASP.NET

Методы MachineKey.Encode и MachineKey.Decode устарели

Сведения

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

Предложение

Взамен рекомендуется использовать Protect(Byte[], String[]) и Unprotect(Byte[], String[]). Кроме того, можно подавить предупреждения сборки или избежать их вывода с помощью более старой версии компилятора. Интерфейсы API по-прежнему поддерживаются.

Имя. Значение
Область Незначительный
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

Изменены интервалы многострочного текстового поля ASP.NET при использовании AntiXSSEncoder

Сведения

В .NET Framework 4.0 между строками многострочного текстового поля при обратной передаче вставлялись дополнительные строки, если использовался System.Web.Security.AntiXss.AntiXssEncoder. В .NET Framework 4.5 эти дополнительные разрывы строк отсутствуют только в том случае, если веб-приложение предназначено для .NET Framework 4.5

Предложение

Имейте в виду, что в веб-приложениях 4.0, перенаправленных на .NET Framework 4.5, многострочные текстовые поля могут быть усовершенствованы, чтобы больше не вставлять дополнительные разрывы строк. Если это нежелательно, для приложения, выполняющегося в .NET Framework 4.5, можно сохранить старое поведение путем изменения версии платформы на .NET Framework 4.0.

Имя. Значение
Область Незначительный
Версия 4,5
Тип Изменение целевой платформы

WebUtility.HtmlEncode и WebUtility.HtmlDecode корректно совершают круговой путь в BMP

Сведения

Для приложений, предназначенных для .NET Framework 4.5, символы, не входящие в базовый многоязыковый набор кодировок (BMP), правильно передаются в оба конца, если они передаются методам HtmlDecode(String).

Предложение

Это изменение не должно влиять на текущие приложения, но для восстановления исходного поведения задайте атрибут targetFramework элемента <httpRuntime> для строки, отличный от "4.5". Также можно задать атрибуты unicodeEncodingConformance и unicodeDecodingConformance элемента конфигурации <webUtility>, чтобы контролировать это поведение вне зависимости от целевой версии .NET Framework.

Имя. Значение
Область Microsoft Edge
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

ClickOnce

Приложения, опубликованные с помощью ClickOnce с использованием сертификата подписи кода SHA-256, могут завершиться ошибкой в Windows 2003

Сведения

Исполняемый файл подписывается с помощью SHA256. Ранее он подписывался с помощью SHA1 независимо от того, какой использовался сертификат подписи кода: SHA-1 или SHA-256. Применение:

  • Все приложения, собранные с помощью Visual Studio 2012 или более поздней версии.
  • Приложения, собранные с помощью Visual Studio 2010 или более ранней версии в системах с установленной платформой .NET Framework 4.5. Кроме того, при наличии .NET Framework 4.5 или более поздней версии манифест ClickOnce также подписывается с помощью SHA-256 для сертификатов SHA-256 независимо от версии .NET Framework, в которой проводилась компиляция.

Предложение

Изменение подписи исполняемого файла ClickOnce влияет только на системы Windows Server 2003; потребуется установка компонента из статьи базы знаний 938397 . Изменение подписи манифеста с SHA-256, даже если целевая платформа приложения — .NET Framework 4.0 или более ранней версии, вводит зависимость среды выполнения для .NET Framework 4.5 или более поздней версии.

Имя. Значение
Область Microsoft Edge
Версия 4,5
Тип Изменение целевой платформы

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

Переменная-итератор Foreach теперь ограничена областью итерации, поэтому используется другая семантика захвата замыкания (в C# 5)

Сведения

Начиная с C# 5 (Visual Studio 2012) переменные-итераторы foreach действуют в рамках итерации. Это может привести к нарушению работы, если код ранее зависел от переменных, не включаемых в замыкание foreach. Признаком этого изменения будет то, что переменная-итератор, переданная делегату, будет рассматриваться как значение, существовавшее во время создания делегата, а не как значение, которое существовало во время вызова делегата.

Предложение

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

Имя. Значение
Область Основная
Версия 4,5
Тип Изменение целевой платформы

Чтобы результирующая задача завершилась, реализация свойства IAsyncResult.CompletedSynchronously должна быть правильной

Сведения

При вызове TaskFactory.FromAsync реализация свойства CompletedSynchronously должна быть правильной, чтобы результирующая задача завершилась. То есть свойство должно возвращать значение true, если (и только если) реализация завершилась синхронно. Раньше свойство не проверялось.

Предложение

Если реализация System.IAsyncResult правильно возвращает значение true для свойства System.IAsyncResult.CompletedSynchronously только тогда, когда задача завершилась синхронно, нарушения работы не будет. Пользователи должны проверять принадлежащие им реализации System.IAsyncResult (если таковые имеются), чтобы убедиться, что они правильно определяют синхронное завершение задачи.

Имя. Значение
Область Microsoft Edge
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

List<T>.ForEach может создавать исключение при изменении элемента списка

Сведения

Начиная с .NET Framework 4.5 перечислитель ForEach(Action<T>) будет создавать исключение System.InvalidOperationException при изменении элемента в вызывающей коллекции. Ранее исключение не создавалось, но могли возникать конфликты.

Предложение

В идеальном случае следует исправить код, чтобы он не изменял списки при перечислении их элементов, поскольку эта операция небезопасна. Чтобы вернуться к предыдущему поведению, приложение должно быть предназначено для платформы .NET Framework 4.0.

Имя. Значение
Область Microsoft Edge
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

Синтаксический анализ System.Uri соответствует стандарту RFC 3987

Сведения

Синтаксический анализ URI претерпел ряд изменений в .NET Framework 4.5. Обратите внимание, что эти изменения касаются только кода, предназначенного для .NET Framework 4.5. Если двоичный файл предназначен для .NET Framework 4.0, будет действовать старое поведение. В синтаксический анализ URI в .NET Framework 4.5 внесены следующие изменения:

  • Синтаксический анализ URI будет выполнять проверку нормализации и символов в соответствии с последними правилами IRI стандарта RFC 3987.
  • Форма нормализации Юникода C будет выполняться только в части узла URI.
  • Недопустимые URI mailto: теперь будут вызывать исключение.
  • Конечные точки в конце сегмента пути теперь сохраняются.
  • Идентификаторы URI file:// не экранируют символ ?.
  • Управляющие символы Юникода с U+0080 по U+009F не поддерживаются.
  • Символы запятой , или %2c не отменяются автоматически.

Предложение

Если необходимы старые семантики синтаксического анализа URI в .NET Framework 4.0 (часто они не требуются), их можно использовать, нацелив приложение на .NET Framework 4.0. Это можно сделать с помощью System.Runtime.Versioning.TargetFrameworkAttribute в сборке или в пользовательском интерфейсе системы проектов Visual Studio на странице свойств проекта.

Имя. Значение
Область Основная
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

Метод System.Uri.IsWellFormedUriString возвращает значение false для относительных URI с символом двоеточия в первом сегменте

Сведения

Начиная с .NET Framework 4.5 IsWellFormedUriString(String, UriKind) будет рассматривать относительные URI с : в первом сегменте как некорректные. Это отличается от поведения System.Uri.IsWellFormedUriString(String, UriKind) в .NET Framework 4.0. Изменение было внесено, чтобы обеспечить соответствие RFC3986.

Предложение

Это изменение (как и другие изменения URI) повлияет только на приложения, предназначенные для .NET Framework 4.5 (или более поздней версии). Чтобы сохранить старое поведение, необходимо нацелить приложение на .NET Framework 4.0. Кроме того, проверьте URI до вызова метода System.Uri.IsWellFormedUriString(String, UriKind), ищущего символы :, которые можно удалить в целях проверки, если вы предпочитаете старое поведение.

Имя. Значение
Область Незначительный
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

Entity Framework

Версия Entity Framework должна соответствовать версии .NET Framework

Сведения

Версия Entity Framework (EF) должна соответствовать версии платформы .NET Framework. Для .NET Framework 4.5 рекомендуется Entity Framework 5. Существуют некоторые известные проблемы с EF 4.x в проекте .NET Framework 4.5, связанные с System.ComponentModel.DataAnnotations. В .NET Framework 4.5 они были перемещены в другую сборку, поэтому существуют проблемы с выбором заметок для использования.

Предложение

Обновление до версии Entity Framework 5 для .NET Framework 4.5

Имя. Значение
Область Основная
Версия 4,5
Тип Изменение целевой платформы

Windows Forms

Конструктор EncoderParameter устарел

Сведения

Конструктор EncoderParameter(Encoder, Int32, Int32, Int32, Int32) устарел. При его использовании будут выводиться предупреждения сборки.

Предложение

Несмотря на то, что конструктор EncoderParameter(Encoder, Int32, Int32, Int32, Int32) будет продолжать работать, во избежание вывода устаревшего предупреждения сборки при повторной компиляции кода с помощью средств .NET Framework 4.5 нужен следующий конструктор: EncoderParameter(Encoder, Int32, EncoderParameterValueType, IntPtr).

Имя. Значение
Область Незначительный
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

Windows Communication Foundation (WCF)

Написание двоичных выходных данных с помощью BodyWriter

Сведения

Если вы используете класс System.ServiceModel.Channels.BodyWriter и используете реализацию для записи двоичных выходных OnWriteBodyContents(XmlDictionaryWriter writer) данных, при перенацеливание на платформа .NET Framework 4.5 может потребоваться выполнить некоторые изменения. Проверьте состояние записи и, если это WriterState.Startтак, выведите Binary xml-элемент оболочки, как показано в следующем фрагменте кода.

protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
{
    bool wroteStartElement = false;
    if (writer.WriteState == WriteState.Start)
    {
        writer.WriteStartElement("Binary", string.Empty);
        wroteStartElement = true;
    }
    writer.WriteBase64(buffer, offset, count);
    if (wroteStartElement)
    {
        writer.WriteEndElement();
    }
}

Кроме того, если вы производится от класса System.ServiceModel.Channels.StreamBodyWriter и переопределяете метод OnWriteBodyContents(XmlDictionaryWriter writer), некоторые изменения могут потребоваться. При выборе платформа .NET Framework 4.0 необходимо было явно записать Binary элемент при переопределении этого метода. Это больше не требуется, если вы нацелены на платформа .NET Framework 4.5, и это приводит к тому, что текст не записывается.

Windows Presentation Foundation (WPF)

WPF TextBox.Text может быть не синхронизирован с привязкой данных

Сведения

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

Предложение

Это не должно иметь отрицательных последствий. Однако можно восстановить прежнее поведение, установив свойству KeepTextBoxDisplaySynchronizedWithTextProperty значение false.

Значение
Область применения Microsoft Edge
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

Windows Workflow Foundation (WF)

Новые (неоднозначные) перегрузки Dispatcher.Invoke могут привести к изменению поведения

Сведения

В .NET Framework 4.5 добавлены новые перегрузки в метод Dispatcher.Invoke, включающие параметр типа Action. Если существующий код перекомпилируется, компиляторы могут разрешить вызовы методов Dispatcher.Invoke, имеющие параметр Delegate, как вызовы методов Dispatcher.Invoke с параметром Action. Если вызов перегрузки Dispatcher.Invoke с Delegate параметром разрешается как вызов перегрузки Dispatcher.Invoke с Action параметром, могут возникнуть следующие различия в поведении:

Предложение

Чтобы избежать неоднозначности (и потенциальных различий в обработке исключений и поведениях блокировки), код, вызывающий Dispatcher.Invoke, может передать пустой object[] как второй параметр в вызов Invoke, чтобы гарантировать разрешение перегрузки метода в .NET Framework 4.0.

Имя. Значение
Область Незначительный
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

Некоторые API-интерфейсы перетаскивания в WorkFlow являются устаревшими

Сведения

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

Предложение

Следует использовать новые API System.Activities.Presentation.DragDropHelper, которые поддерживают операции с несколькими объектами. Кроме того, можно подавить предупреждения сборки или избежать их вывода с помощью более старой версией компилятора. Интерфейсы API по-прежнему поддерживаются.

Имя. Значение
Область Незначительный
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

Типы WorkFlow 3.0 устарели

Сведения

API-интерфейсы Windows Workflow Foundation (WWF) 3.0 (из пространства имен System.Workflow) теперь являются устаревшими.

Предложение

Вместо них следует использовать новые интерфейсы API WWF 4.0 (в System.Activities). Пример использования новых интерфейсов API можно найти здесь, а дальнейшие рекомендации доступны здесь. Кроме того, поскольку API-интерфейсы WWF 3.0 по-прежнему поддерживаются, их можно использовать, а чтобы избежать вывода предупреждения во время построения, его можно подавить или воспользоваться более старой версией компилятора.

Имя. Значение
Область Основная
Версия 4,5
Тип Изменение целевой платформы

WorkflowDesigner.Load не удаляет свойство символа

Сведения

При выборе целевой версии платформы .NET Framework 4.5 в конструкторе рабочих процессов и загрузке повторно размещаемого рабочего процесса 3.5 с помощью метода Load() во время сохранения рабочего процесса создается исключение System.Xaml.XamlDuplicateMemberException.

Предложение

Эта ошибка возникает только при нацеливании на .NET Framework 4.5 в конструкторе рабочих процессов, поэтому ее можно устранить, установив WorkflowDesigner.Context.Services.GetService<DesignerConfigurationService>().TargetFrameworkName в 4.0 .NET Framework.

Кроме того, этой ошибки можно избежать, используя для загрузки рабочего процесса метод Load(String), а не Load().

Имя. Значение
Область Основная
Версия 4,5
Тип Изменение целевой платформы

Затронутые API

XML, XSLT

Более строгая проверка схемы XML

Сведения

В .NET Framework 4.5 проверка схемы XML является более строгой. При использовании xsd:anyURI для проверки URI, такого как протокол MailTo, при наличии пробелов в URI возникает сбой проверки. В предыдущих версиях .NET Framework проверка проходила успешно. Изменение затрагивает только приложения, предназначенные для .NET Framework 4.5.

Предложение

Если требуется менее строгая проверка .NET Framework 4.0, проверяющее приложение может быть ориентировано на версию 4.0 (или более раннюю) платформы .NET Framework. При изменении целевой платформы на .NET Framework 4.5 необходимо выполнить проверку кода и убедиться, что недопустимые URI (с пробелами) не ожидаются в качестве значений атрибута с типом данных anyURI.

Имя. Значение
Область Незначительный
Версия 4,5
Тип Изменение целевой платформы

.NET Framework 4.5.1

ADO.NET

DbParameter.Precision и DbParameter.Scale теперь являются открытыми виртуальными членами

Сведения

Precision и Scale реализованы как открытые виртуальные свойства. Они заменяют соответствующие явные реализации интерфейса: IDbDataParameter.Precision и IDbDataParameter.Scale.

Предложение

При повторном создании поставщика базы данных ADO.NET эти различия потребуют применения ключевого слова override к свойствам Precision и Scale. Это требуется только в случае повторного создания компонентов; существующие двоичные файлы будут продолжать работать.

Имя. Значение
Область Незначительный
Версия 4.5.1
Тип Изменение целевой платформы

Затронутые API

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

Атрибут ObsoleteAttribute экспортируется как ObsoleteAttribute и DeprecatedAttribute в сценариях WinMD

Сведения

При создании библиотеки метаданных Windows (WINMD-файл) атрибут System.ObsoleteAttribute экспортируется как System.ObsoleteAttribute и Windows.Foundation.DeprecatedAttribute.

Предложение

При перекомпиляции существующего исходного кода, использующего атрибут System.ObsoleteAttribute, могут выдаваться предупреждения при использовании кода из C++/CX или JavaScript. Не рекомендуется применять атрибуты System.ObsoleteAttribute и Windows.Foundation.DeprecatedAttribute в коде в управляемых сборках. Это может привести к предупреждениям сборки.

Имя. Значение
Область Microsoft Edge
Версия 4.5.1
Тип Изменение целевой платформы

Entity Framework

Построение EDMX Entity Framework с помощью Visual Studio 2013 может завершиться ошибкой MSB4062, если используются задачи EntityDeploySplit или EntityClean

Сведения

Инструменты MSBuild 12.0 (в составе Visual Studio 2013) изменили расположение файлов MSBuild, что привело к недействительности старых файлов целей построения Entity Framework. В результате задачи EntityDeploySplit и EntityClean завершаются ошибкой, так как они не могут найти Microsoft.Data.Entity.Build.Tasks.dll. Обратите внимание, что это нарушение возникает вследствие изменения набора инструментов (MSBuild и Visual Studio), а не из-за изменения платформы .NET Framework. Оно происходит только при обновлении средств разработчика, а не просто при обновлении .NET Framework.

Предложение

Начиная с .NET Framework 4.6 файлы целей построения Entity Framework предназначены для работы с новым макетом MSBuild. Проблема будет решена после обновления до этой версии. Кроме того, это решение можно использовать для исправления файлов целей построения напрямую.

Имя. Значение
Область Основная
Версия 4.5.1
Тип Изменение целевой платформы

MSBuild

Задача ResolveAssemblyReference теперь предупреждает о зависимостях с неправильной архитектурой

Сведения

Задача выдает предупреждение (MSB3270), которое означает, что ссылка или ее зависимости не соответствуют архитектуре приложения. Например, это происходит, если приложение, скомпилированное с параметром AnyCPU, содержит 32-разрядную ссылку. Такой сценарий может привести к сбою приложения во время выполнения (в этом случае: если приложение развертывается как 64-разрядный процесс).

Предложение

Существует две области влияния.

  • Во время перекомпиляции выдаются предупреждения, которые отсутствовали при компиляции в предыдущей версии MSBuild. Однако поскольку в предупреждении указан возможный источник ошибки среды выполнения, его следует проверить.
  • Если предупреждения считаются ошибками, приложение скомпилировано не будет.
Имя. Значение
Область Незначительный
Версия 4.5.1
Тип Изменение целевой платформы

Windows Presentation Foundation (WPF)

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

Сведения

Попытка привязки данных к свойству без общедоступного метода задания никогда не поддерживалась. Начиная с .NET Framework 4.5.1 этот сценарий выдает исключение System.InvalidOperationException. Обратите внимание, что это новое исключение создается только для приложений, которые предназначены специально для .NET Framework 4.5.1. Если приложение предназначено для .NET Framework 4.5, вызов будет разрешен. Если приложение не предназначено для определенной версии .NET Framework, привязка будет рассматриваться как односторонняя.

Предложение

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

Имя. Значение
Область Незначительный
Версия 4.5.1
Тип Изменение целевой платформы

Затронутые API

.NET Framework 4.5.2

Visual Basic .NET

VB.NET больше не поддерживает частичные квалификации пространства имен для API-интерфейсов System.Windows

Сведения

Начиная с .NET Framework 4.5.2 в проектах VB.NET невозможно задать API-интерфейсы System.Windows с частично указанными пространствами имен. Например, ссылка на Windows.Forms.DialogResult завершится ошибкой. Вместо этого код должен ссылаться на полное доменное имя (DialogResult) или импортировать конкретное пространство имен и сослаться просто на System.Windows.Forms.DialogResult.

Предложение

Следует обновить код для ссылки на API System.Windows либо с простыми именами (и импортом соответствующего пространства имен), либо с полными доменными именами.

Имя. Значение
Область Незначительный
Версия 4.5.2
Тип Изменение целевой платформы

Windows Forms

DataObject.GetData теперь получает данные в кодировке UTF-8

Сведения

В приложениях, предназначенных для .NET Framework 4 или выполняющихся в .NET Framework 4.5.1 или более ранних версий, DataObject.GetData получает HTML-данные в виде строки ASCII. В результате символы, не относящиеся к ASCII (т. е. символы с кодами ASCII больше 0x7F), представляются двумя случайными символами.

Для приложений, предназначенных для NET Framework 4.5 и более поздней версии и выполняемых в .NET Framework 4.5.2, DataObject.GetData получает HTML-данные в формате UTF-8, который правильно представляет символы с кодами более 0x7F.

Предложение

Если реализован обходной путь для проблемы с кодировкой HTML-строк (например, явная кодировка HTML-строки, полученной из буфера обмена, путем ее передачи в метод System.Text.UTF8Encoding.GetString(Byte[], Int32, Int32)), и выполняется изменение целевой платформы приложения с версии 4 на версию 4.5, этот обходной путь необходимо удалить. Если по какой-либо причине требуется старое поведение, для приложения можно выбрать целевую платформу .NET Framework 4.0.

Имя. Значение
Область Microsoft Edge
Версия 4.5.2
Тип Изменение целевой платформы

Затронутые API

Windows Workflow Foundation (WF)

WorkflowDesigner.Load не удаляет свойство символа

Сведения

При выборе целевой версии платформы .NET Framework 4.5 в конструкторе рабочих процессов и загрузке повторно размещаемого рабочего процесса 3.5 с помощью метода Load() во время сохранения рабочего процесса создается исключение System.Xaml.XamlDuplicateMemberException.

Предложение

Эта ошибка возникает только при нацеливании на .NET Framework 4.5 в конструкторе рабочих процессов, поэтому ее можно устранить, установив WorkflowDesigner.Context.Services.GetService<DesignerConfigurationService>().TargetFrameworkName в 4.0 .NET Framework.

Кроме того, этой ошибки можно избежать, используя для загрузки рабочего процесса метод Load(String), а не Load().

Имя. Значение
Область Основная
Версия 4,5
Тип Изменение целевой платформы

Затронутые API