Изменения среды выполнения для миграции на платформа .NET Framework 4.6.x

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

.NET Framework 4.6

ASP.NET

Если в GridViews для свойства AllowCustomPaging установлено значение true, может возникать событие PageIndexChanging при выходе из последней страницы представления

Сведения

В результате ошибки в .NET Framework 4.5 иногда событие System.Web.UI.WebControls.GridView.PageIndexChanging не срабатывает для System.Web.UI.WebControls.GridView со свойством System.Web.UI.WebControls.GridView.AllowCustomPaging.

Предложение

Эта проблема была устранена в .NET Framework 4.6 и может быть решена путем обновления до этой версии платформы .NET Framework. Чтобы обойти эту проблему, приложение может иметь явный BindGrid в любом Page_Load, которое вызывает эти условия (System.Web.UI.WebControls.GridView находится на последней странице, а LastSystem.Web.UI.WebControls.GridView.PageSize отличается от System.Web.UI.WebControls.GridView.PageSize). Кроме того, приложение можно изменить, чтобы разрешить разбивку на страницы (вместо пользовательского разбиения по страницам), поскольку в этом случае проблемы не возникают.

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

Затронутые API

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

Объект ConcurrentDictionary, сериализованный в .NET Framework 4.5 с помощью NetDataContractSerializer, нельзя десериализовать в .NET Framework 4.5.1 или 4.5.2

Сведения

Из-за внутренних изменений типа объекты ConcurrentDictionary<TKey,TValue>, сериализованные в .NET Framework 4.5 с помощью System.Runtime.Serialization.NetDataContractSerializer, не могут быть десериализованы в .NET Framework 4.5.1 или .NET Framework 4.5.2. Обратите внимание, что сериализация в .NET Framework 4.5.x с последующей десериализацией в .NET Framework 4.5 будет работать нормально. Аналогичным образом, сериализация в версиях 4.x работает в .NET Framework 4.6. Сериализация и десериализация в одной версии платформы .NET Framework не затрагивается.

Предложение

Если необходимо сериализовать и десериализировать System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> между платформа .NET Framework 4.5 и платформа .NET Framework 4.5.1/4.5.2, то вместо него следует использовать System.Runtime.Serialization.NetDataContractSerializerдругой сериализаторSystem.Runtime.Serialization.DataContractSerializer. Кроме того, поскольку эта проблема была устранена в .NET Framework 4.6, она может быть решена путем обновления до этой версии платформы .NET Framework.

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

Затронутые API

Невозможно обнаружить с помощью анализа API.

AppDomainSetup.DynamicBase больше не задается случайно с помощью UseRandomizedStringHashAlgorithm

Сведения

В версиях до .NET Framework 4.6 значение DynamicBase задавалось случайным образом между доменами приложений или между процессами, если в файле конфигурации приложения был включен UseRandomizedStringHashAlgorithm. Начиная с версии .NET Framework 4.6, DynamicBase будет возвращать постоянный результат между различными выполняющимися экземплярами приложения и между различными доменами приложений. Динамические основания при этом по-прежнему будут различаться для разных приложений. Это изменение исключает только случайный элемент именования для различных экземпляров одного приложения.

Предложение

Обратите внимание, что включение UseRandomizedStringHashAlgorithm не приведет к случайной установке DynamicBase. Если требуется случайное основание, для его получения необходимо использовать код приложения, а не этот API.

Имя. Значение
Область Microsoft Edge
Версия 4,6
Тип Параметры выполнения

Затронутые API

Вызов Attribute.GetCustomAttributes в свойстве индексатора больше не вызывает исключение AmbiguousMatchException, если тип индекса может разрешить неоднозначность

Сведения

В версиях .NET Framework, более ранних, чем 4.6, вызов GetCustomAttribute(s) в свойстве индексатора, которое отличалось от другого свойства только по типу индекса, приведет к System.Reflection.AmbiguousMatchException. Начиная с .NET Framework 4.6, атрибуты свойства возвращаются правильно.

Предложение

Имейте в виду, что теперь GetCustomAttribute(s) будут использоваться чаще. Если приложение ранее зависело от System.Reflection.AmbiguousMatchException, теперь для явного поиска нескольких индексаторов следует использовать отражение.

Имя. Значение
Область Microsoft Edge
Версия 4,6
Тип Параметры выполнения

Затронутые API

Профилировщики не перечисляют COR_PRF_GC_ROOT_HANDLE

Сведения

В .NET Framework 4.5.1 API профилирования RootReferences2() по ошибке никогда не возвращает COR_PRF_GC_ROOT_HANDLE (вместо этого возвращается COR_PRF_GC_ROOT_OTHER). Эта проблема решена в .NET Framework 4.6.

Предложение

Эта проблема была устранена в .NET Framework 4.6 и может быть решена путем обновления до этой версии платформы .NET Framework.

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

Затронутые API

Невозможно обнаружить с помощью анализа API.

EventListeners трассировки событий Windows не выполняют запись событий от поставщиков с явными ключевыми словами (например, от поставщика TPL)

Сведения

EventListeners трассировки событий Windows с пустой маской ключевого слова неправильно записывают события от поставщиков с явными ключевыми словами. В платформе .NET Framework 4.5 поставщик TPL начал предоставлять явные ключевые слова и привел к возникновению этой проблемы. В .NET Framework 4.6 EventListeners были обновлены, чтобы больше не вызывать эту проблему.

Предложение

Чтобы обойти эту проблему, замените вызовы вызовами EnableEvents(EventSource, EventLevel) перегрузки EnableEvents, которая явно указывает маску "любые ключевое слово" для использования: EnableEvents(eventSource, level, unchecked((EventKeywords)0xFFFFffffFFFFffff))

Кроме того, эта проблема была устранена в .NET Framework 4.6 и может быть решена путем обновления до этой версии платформы .NET Framework.

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

Затронутые API

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

Сведения

Начиная с .NET Framework 4.6 класс System.Globalization.PersianCalendar использует алгоритм солнечного календаря хиджры. Начиная с .NET Framework 4.6 при преобразовании дат между System.Globalization.PersianCalendar и другими календарями может быть получен немного другой результат для дат, ранее 1800 г. или позднее 2023 г. (по григорианскому календарю). Кроме того, PersianCalendar.MinSupportedDateTime теперь March 22, 0622 вместо March 21, 0622.

Предложение

Имейте в виду, что при использовании персидского календаря в .NET Framework 4.6 некоторые даты в прошлом или будущем могут несколько отличаться. Кроме того, даты, сериализуемые между процессами, которые могут выполняться в различных версиях .NET Framework, не следует хранить в виде строк дат персидского календаря (поскольку эти значения могут быть разными).

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

Затронутые API

Объекты отражения больше невозможно передавать из управляемого кода во внепроцессные клиенты DCOM

Сведения

Объекты отражения больше невозможно передавать из управляемого кода во внепроцессные клиенты DCOM. Затронуты следующие типы:

Вызовы IMarshal объекта возвращают E_NOINTERFACE.

Предложение

Обновите код маршалинга для работы с объектами без отражения.

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

Затронутые API

TargetFrameworkName для домена приложения по умолчанию больше не принимает значение NULL по умолчанию, если оно не задано

Сведения

Свойство System.AppDomainSetup.TargetFrameworkName имело ранее значение NULL в домене приложения по умолчанию, если оно не было задано явно. Начиная с версии 4.6, свойство System.AppDomainSetup.TargetFrameworkName для домена приложения по умолчанию будет иметь значение по умолчанию, полученное из свойства TargetFrameworkAttribute (если оно доступно). Домены приложений не по умолчанию будут по-прежнему наследовать свойство System.AppDomainSetup.TargetFrameworkName от домена приложения по умолчанию (который не будет по умолчанию иметь значение NULL в 4.6), если оно явно не переопределено.

Предложение

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

Имя. Значение
Область Microsoft Edge
Версия 4,6
Тип Параметры выполнения

Затронутые API

Теперь метод X509Certificate2.ToString(Boolean) не создает исключение, когда .NET не удается обработать сертификат

Сведения

В .NET Framework 4.5.2 и более ранних версиях этот метод создавал исключение, если значение true передавалось в параметр verbose и были установлены сертификаты, не поддерживаемые .NET Framework. Теперь метод будет выполняться успешно и возвращать допустимую строку, в которой пропущены недоступные части сертификата.

Предложение

Любой код, зависящий от X509Certificate2.ToString(Boolean), следует обновить для ожидания того, что в некоторых случаях, когда ранее API возвращал исключение, в возвращаемой строке могут отсутствовать некоторые данные сертификата (например, открытый ключ, закрытый ключ и расширения).

Имя. Значение
Область Microsoft Edge
Версия 4,6
Тип Параметры выполнения

Затронутые API

Data

Попытка подключения TCP/IP к базе данных SQL Server, которая сопоставляется с localhost, завершается ошибкой

Сведения

В платформа .NET Framework 4.6 и 4.6.1 попытка подключения TCP/IP к базе данных SQL Server, которая разрешает localhost сбой с ошибкой, "При установке подключения к SQL Server произошла ошибка, связанная с сетью или экземпляром. Сервер не найден или недоступен. Проверьте правильность имени экземпляра и настройку сервера SQL Server для удаленных подключений. (поставщик: сетевые интерфейсы SQL, ошибка: 26 — ошибка поиска указанного сервера/экземпляра)"

Предложение

Эта проблема устранена, и восстановлено прежнее поведение в .NET Framework 4.6.2. Для подключения к базе данных SQL Server, которой сопоставляется localhost, выполните обновление до .NET Framework 4.6.2.

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

Затронутые API

Невозможно обнаружить с помощью анализа API.

Отладчик

Значения NULL операции объединения отображаются в отладчике с запаздыванием на один шаг

Сведения

Из-за ошибки в .NET Framework 4.5 значения, заданные с использованием операции объединения NULL, не отображаются в отладчике немедленно после выполнения операции присваивания в 64-разрядной версии платформы.

Предложение

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

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

Затронутые API

Невозможно обнаружить с помощью анализа API.

Сеть

ContentDisposition DateTime возвращает немного другую строку

Сведения

Строковые представления System.Net.Mime.ContentDisposition были обновлены, начиная с версии 4.6, чтобы всегда представлять компонент часа System.DateTime с использованием двух цифр. Это сделано в соответствии с RFC822 и RFC2822. В результате ToString() возвращает немного другую строку в 4.6 в сценариях, где один из элементов времени расположения имел значение, предшествующее 10:00. Обратите внимание, что ContentDispositions иногда сериализуются посредством преобразования в строки, поэтому следует проверить все операции ToString(), сериализации или вызовы GetHashCode.

Предложение

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

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

Затронутые API

Сериализация

Изменилось сообщение об исключении для неудавшейся сериализации DataContract в случае неизвестного типа

Сведения

Начиная с .NET Framework 4.6 уточнено сообщение об исключении, отображающееся в случае, если System.Runtime.Serialization.DataContractSerializer или System.Runtime.Serialization.Json.DataContractJsonSerializer не может выполнить сериализацию или десериализацию из-за отсутствия "известных типов".

Предложение

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

Имя. Значение
Область Microsoft Edge
Версия 4,6
Тип Параметры выполнения

Затронутые API

Установка и развертывание

Изменения в управлении версиями продукта в .NET Framework 4.6 и более поздних версиях

Сведения

Управление версиями продукта отличается от реализованного в предыдущих версиях платформы .NET Framework, в особенности начиная с .NET Framework 4, 4.5, 4.5.1 и 4.5.2. Ниже приведено подробное описание изменений.

  • Значение записи Version в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full изменилось на 4.6.xxxxx в .NET Framework 4.6 и ее доработанных версиях и на 4.7.xxxxx в .NET Framework 4.7 и 4.7.1. В .NET Framework 4.5, 4.5.1 и 4.5.2 использовался формат 4.5.xxxxx.
  • Управление версиями файлов и продукта для файлов .NET Framework было изменено с более ранней схемы управления версиями 4.0.30319.x на 4.6.X.0 для .NET Framework 4.6 и ее доработанных выпусков, а также на 4.7.X.0 для .NET Framework 4.7 и 4.7.1. Вы можете увидеть эти новые значения в свойствах файла, щелкнув файл правой кнопкой мыши.
  • Атрибуты AssemblyFileVersionAttribute и AssemblyInformationalVersionAttribute для управляемых сборок имеют значения версий в виде 4.6.X.0 на платформе .NET Framework 4.6 и в ее доработанных выпусках или 4.7.X.0 на платформе .NET Framework 4.7 и 4.7.1.
  • В .NET Framework 4.6, 4.6.1, 4.6.2, 4.7 и 4.7.1 свойство Environment.Version возвращает исправленную строку версии 4.0.30319.42000. В .NET Framework 4, 4.5, 4.5.1 и 4.5.2 оно возвращает строки версии в формате 4.0.30319.xxxxx (например, "4.0.30319.18010"). Обратите внимание, что создание новых зависимостей кода приложения от свойства Environment.Version не рекомендуется.

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

Предложение

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

Внимание

Имя подраздела — NET Framework Setup, а не .NET Framework Setup.

  • Чтобы определить путь к каталогу общеязыковой среды выполнения .NET Framework, вызовите метод RuntimeEnvironment.GetRuntimeDirectory().
  • Чтобы получить версию среды CLR, вызовите метод RuntimeEnvironment.GetSystemVersion(). Для .NET Framework 4 и ее доработанных выпусков (.NET Framework 4.5, 4.5.1, 4.5.2 и .NET Framework 4.6. 4.6.1, 4.6.2, 4.7 и 4.7.1) возвращается строка v4.0.30319.
Имя. Значение
Область Незначительный
Версия 4,6
Тип Параметры выполнения

Затронутые API

Невозможно обнаружить с помощью анализа API.

.NET Framework 4.6 не использует версию 4.5.x.x для собственной регистрации в реестре

Сведения

Ключ версии, установленный в реестре (HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full) для платформы .NET Framework 4.6, ожидаемо начинается с "4.6", а не с "4.5". Приложения, которые используют эти разделы реестра для определения установленных на компьютере версий .NET Framework, следует обновить таким образом, чтобы понимать, что 4.6 — это новая возможная версия, совместимая с предыдущими выпусками 4.5.x.

Предложение

Обновите приложения, проверяющие установку версию .NET Framework 4.5 в соответствующих разделах реестра, так, чтобы они принимали версию 4.6.

Имя. Значение
Область Microsoft Edge
Версия 4,6
Тип Параметры выполнения

Затронутые API

Невозможно обнаружить с помощью анализа API.

Windows Communication Foundation (WCF)

Службы WCF, использующие NETTCP с уровнем безопасности SSL и проверкой подлинности на основе сертификатов MD5

Сведения

В платформе .NET Framework 4.6 в список протоколов WCF SSL по умолчанию добавляются протоколы TLS 1.1 и TLS 1.2. Если на клиентском компьютере и на сервере установлена платформа .NET Framework 4.6 или более поздняя версия, для согласования используется протокол TLS 1.2. Протокол TLS 1.2 не поддерживает проверку подлинности на основе сертификатов MD5. Поэтому, если используется сертификат MD5, клиент WCF не сможет подключиться к службе WCF.

Предложение

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

  • Обновите сертификат, чтобы он не использовал алгоритм MD5. Это рекомендуемое решение.
  • Если привязка не настроена динамически в исходном коде, обновите файл конфигурации приложения, чтобы использовать TLS 1.1 или более раннюю версию протокола. Это позволяет продолжать использовать сертификат с хэш-алгоритмом MD5.

Предупреждение

Это решение не рекомендуется, поскольку сертификат с хэш-алгоритмом MD5 считается небезопасным.

Это выполняется в следующем файле конфигурации:

<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding>
          <security mode= "None/Transport/Message/TransportWithMessageCredential" >
            <transport clientCredentialType="None/Windows/Certificate"
                       protectionLevel="None/Sign/EncryptAndSign"
                       sslProtocols="Ssl3/Tls1/Tls11">
            </transport>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.ServiceModel>
</configuration>
  • Если привязка настроена в исходном коде динамически, настройте свойство TcpTransportSecurity.SslProtocols на использование TLS 1.1 (SslProtocols.Tls11) или более ранней версии протокола в исходном коде.

Предупреждение

Это решение не рекомендуется, поскольку сертификат с хэш-алгоритмом MD5 считается небезопасным.

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

Затронутые API

Невозможно обнаружить с помощью анализа API.

Windows Presentation Foundation (WPF)

Доступ к выделенным элементам DataGrid WPF из события UnloadingRow DataGrid может привести к исключению NullReferenceException

Сведения

Из-за ошибки в .NET Framework 4.5 обработчики событий DataGrid, которые выполняют удаление строки, могут привести к созданию исключения System.NullReferenceException при попытке получить доступ к свойствам System.Windows.Controls.Primitives.Selector.SelectedItem или System.Windows.Controls.Primitives.MultiSelector.SelectedItemsDataGrid.

Предложение

Эта проблема была устранена в .NET Framework 4.6 и может быть решена путем обновления до этой версии платформы .NET Framework.

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

Затронутые API

Вызов Items.Refresh для ListBox, ListView или DataGrid в WPF с выбранным элементом может привести к появлению в элементе повторяющихся записей

Сведения

В .NET Framework 4.5 вызов ListBox.Items.Refresh из кода, когда элементы выбраны в System.Windows.Controls.ListBox, может привести к дублированию выбранных элементов в списке. Аналогичная проблема возникает с System.Windows.Controls.ListView и System.Windows.Controls.DataGrid. Эта проблема устранена в EntityFramework 4.6.

Предложение

Эту проблему можно решить с помощью программных средств, отменив выбор элементов до вызова метода System.Windows.Data.CollectionView.Refresh() и затем повторно выбрав их после завершения вызова. Кроме того, эта проблема была устранена в .NET Framework 4.6 и может быть решена путем обновления до этой версии платформы .NET Framework.

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

Затронутые API

CoerceIsSelectionBoxHighlighted

Сведения

Некоторые последовательности действий, в которых используются System.Windows.Controls.ComboBox и соответствующий источник данных, могут привести к исключению System.NullReferenceException.

Предложение

По возможности выполните обновление до .NET Framework 4.6.2.

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

Затронутые API

Проблема с привязкой ListBoxItem IsSelected к ObservableCollection<T>.Move

Сведения

Вызов Move(Int32, Int32) или MoveItem(Int32, Int32) для коллекции, привязанной к System.Windows.Controls.ListBox с выделенными элементами, может привести к последующему выделению или отмене выделения элементов System.Windows.Controls.ListBox.

Предложение

Чтобы обойти эту проблему, выполните вызов System.Collections.ObjectModel.Collection<T>.Remove(T) и System.Collections.ObjectModel.Collection<T>.Insert(Int32, T) вместо Move(Int32, Int32). Кроме того, эта проблема была устранена в .NET Framework 4.6 и может быть решена путем обновления до этой версии платформы .NET Framework.

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

Затронутые API

При щелчке правой кнопкой мыши на заголовке строки WPF DataGrid изменяется выделение DataGrid

Сведения

Если щелкнуть правой кнопкой мыши выделенный заголовок строки System.Windows.Controls.DataGrid при наличии нескольких выделенных строк, выделение System.Windows.Controls.DataGrid изменится таким образом, что будет выделена только эта строка.

Предложение

Эта проблема была устранена в .NET Framework 4.6 и может быть решена путем обновления до этой версии платформы .NET Framework.

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

Затронутые API

WPF создает процесс wisptis.exe, который может заблокировать мышь

Сведения

Проблема появилась в версии 4.5.2 — процесс wisptis.exe создается и блокирует мышь.

Предложение

Исправление этой проблемы доступно в сервисном выпуске платформы .NET Framework 4.5.2 (пакет исправлений 3026376) или через обновление до версии .NET Framework 4.6

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

Затронутые API

Невозможно обнаружить с помощью анализа API.

Проверка орфографии WPF в элементах управления с поддержкой текста не будет работать в Windows 10 для языков, не указанных в списке языков ввода ОС

Сведения

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

Предложение

Имейте в виду, что язык или текст, проверка которого выполняется, следует добавить как язык ввода, чтобы функция проверки орфографии работала в Windows 10.

Имя. Значение
Область Microsoft Edge
Версия 4,6
Тип Параметры выполнения

Затронутые API

Невозможно обнаружить с помощью анализа API.

Окна WPF отображаются без обрезки, если изображение выходит за пределы одного монитора

Сведения

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

Предложение

Это поведение (отсутствие или наличие обрезки) можно задать явным образом с помощью элемента <EnableMultiMonitorDisplayClipping> в <appSettings> в файле конфигурации приложения или задав свойство EnableMultiMonitorDisplayClipping при запуске приложения.

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

Затронутые API

Невозможно обнаружить с помощью анализа API.

.NET Framework 4.6.1

Инструменты

Contract.Invariant или Contract.Требуется<TException> не считают String.IsNullOrEmpty чистой

Сведения

Для приложений, предназначенных для платформа .NET Framework 4.6.1, если инвариантный контракт для Contract.Invariant вызова метода или предварительный контракт для Requires вызовов String.IsNullOrEmpty метода, перезаписатель выдает предупреждение компилятора CC1036: "Обнаруженный вызов метода System.String.IsNullOrWhiteSpace(System.String)" без [Pure] в методе". Это предупреждение компилятора, а не ошибка компилятора.

Предложение

Проблема была устранена в билете 339 на сайте GitHub. Чтобы устранить это предупреждение, можно скачать и скомпилировать обновленную версию исходного кода для инструментов контрактов кода с сайта GitHub. Сведения о скачивании находятся в нижней части страницы.

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

Затронутые API

Windows Presentation Foundation (WPF)

Поэлементная прокрутка плоского списка с элементами, имеющими различную высоту в пикселях

Сведения

Когда System.Windows.Controls.ItemsControl отображает коллекцию с помощью виртуализации (IsVirtualizing=true) и прокрутки элемента (ScrollUnit=Item) и когда элемент управления прокручивается для отображения элемента, высота которого в пикселях отличается о высоты соседних элементов, System.Windows.Controls.VirtualizingStackPanel выполняет итерацию по всем элементам в коллекции. При выполнении этой итерации пользовательский интерфейс не отвечает на запросы. Такая итерация происходит и в других ситуациях, даже в более ранних выпусках .NET Framework. Например, она происходит при пиксельной прокрутке (ScrollUnit=Pixel) при обнаружении элемента другой высоты в пикселях, а также при поэлементной прокрутке иерархических данных (например, в элементе управления System.Windows.Controls.TreeView или System.Windows.Controls.ItemsControl с включенным группированием) при обнаружении элемента, число подчиненных элементов которого отличается от соседних элементов. Для поэлементной прокрутки элементов с разной высотой в пикселях эта итерация была представлена в .NET Framework 4.6.1, чтобы устранить ошибки, связанные с макетом иерархических данных. Итерация не требуется, если данные не структурированы (без иерархии), и в этом случае .NET Framework 4.6.2 не выполняет ее.

Предложение

Если итерация выполняется в .NET Framework 4.6.1, но не в более ранних выпусках, т. е. если System.Windows.Controls.ItemsControl прокручивает поэлементно плоский список с элементами разной высоты в пикселях, то существует два решения:

  • Установите .NET Framework 4.6.2.
  • Установите исправление HR 1605 для .NET Framework 4.6.1.
Имя. Значение
Область Незначительный
Версия 4.6.1
Тип Параметры выполнения

Затронутые API

Исключение ObjectDisposedException, создаваемое средством проверки орфографии WPF

Сведения

В некоторых случаях при завершении работы приложений WPF происходит сбой с исключением System.ObjectDisposedException, создаваемым средством проверки орфографии. Эта ошибка исправлена в WPF .NET Framework 4.7 за счет правильной обработки этого исключения, что позволяет исключить подобное нежелательное поведение приложений. Следует отметить, что случайные первичные исключения могут по-прежнему наблюдаться в приложениях, выполняемых в режиме отладки.

Предложение

Выполните обновление до .NET Framework 4.7.

Имя. Значение
Область Microsoft Edge
Версия 4.6.1
Тип Параметры выполнения

Затронутые API

Невозможно обнаружить с помощью анализа API.

Проверка орфографии WPF завершается сбоем непредвиденным образом

Сведения

Сюда относится целый ряд проблем, связанных со средством проверки орфографии WPF:

  • В некоторых случаях средство проверки орфографии WPF создает исключение System.Runtime.InteropServices.COMException
  • Средство проверки орфографии WPF завершается сбоем с исключением UnauthorizedAccessException при запуске приложений с использованием параметра "Запуск от имени другого пользователя"
  • Средство проверки орфографии WPF неверно определяет орфографические ошибки в составных словах, например "Hausnummer" в немецком языке.

Предложение

Проблема 1. Эта проблема исправлена в .NET Framework 4.6.2. Проблема 2. Средство проверки орфографии WPF больше не поддерживается при запуске приложений с использованием параметра "Запуск от имени другого пользователя". Начиная с версии .NET Framework 4.6.2, работа запускаемых таким образом приложений не завершается непредвиденным сбоем. Вместо этого средство проверки орфографии автоматически отключается. Проблема 3. Эта проблема была исправлена в версии .NET Framework 4.6.2.

Имя. Значение
Область Microsoft Edge
Версия 4.6.1
Тип Параметры выполнения

Затронутые API

Невозможно обнаружить с помощью анализа API.

.NET Framework 4.6.2

Data

Попытка подключения TCP/IP к базе данных SQL Server, которая сопоставляется с localhost, завершается ошибкой

Сведения

В платформа .NET Framework 4.6 и 4.6.1 попытка подключения TCP/IP к базе данных SQL Server, которая разрешает localhost сбой с ошибкой, "При установке подключения к SQL Server произошла ошибка, связанная с сетью или экземпляром. Сервер не найден или недоступен. Проверьте правильность имени экземпляра и настройку сервера SQL Server для удаленных подключений. (поставщик: сетевые интерфейсы SQL, ошибка: 26 — ошибка поиска указанного сервера/экземпляра)"

Предложение

Эта проблема устранена, и восстановлено прежнее поведение в .NET Framework 4.6.2. Для подключения к базе данных SQL Server, которой сопоставляется localhost, выполните обновление до .NET Framework 4.6.2.

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

Затронутые API

Невозможно обнаружить с помощью анализа API.

Период блокировки пула соединений для баз данных Azure SQL удален

Сведения

Начиная с .NET Framework 4.6.2 в запросах на открытие подключения к известным базам данных Azure SQL (*.database.windows.net, *.database.chinacloudapi.cn, *.database.usgovcloudapi.net, *.database.cloudapi.de) удален период блокировки пула соединения, и ошибки открытия подключения не кэшируются. Почти сразу же после временных ошибок подключения будут выполняться повторные попытки запросов на открытие подключения. Это изменение позволяет немедленно повторять попытку открытого подключения к базам данных Azure SQL, повышая тем самым производительность облачных приложений. Для всех остальных попыток подключений период блокировки пула подключений продолжает действовать и далее.

В платформа .NET Framework 4.6.1 и более ранних версиях, когда приложение сталкивается с временным сбоем подключения при подключении к базе данных, попытка подключения не может быть выполнена быстро, так как пул подключений кэширует ошибку и повторно создает его в течение 5 секунд до 1 минуты. Дополнительные сведения см. в разделе Объединение подключений в пул в SQL Server (ADO.NET). Такое поведение является проблемным для подключений к базам данных Azure SQL, так как они часто завершаются временными ошибками, которые обычно устраняются через несколько секунд. Функция блокировки пула соединений означает, что приложение не может подключиться к базе данных в течение продолжительного периода, даже если база данных доступна и приложению необходимо преобразование в течение нескольких секунд.

Предложение

Если такое поведение нежелательно, вы можете настроить период блокирования пула подключений, задав свойство System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod, представленное в .NET Framework 4.6.2. Значение этого свойства является членом перечисления System.Data.SqlClient.PoolBlockingPeriod, которое принимает одно из трех значений:

Чтобы восстановить прежнее поведение, задайте свойству System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod значение AlwaysBlock.

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

Затронутые API

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

Теперь поддерживаются категории стандартной версии Юникода 8.0

Сведения

В .NET Framework 4.6.2 данные Юникода были обновлены со стандартной версии 6.3 до версии 8.0. При запросе категорий символов Юникода в .NET Framework 4.6.2 некоторые результаты могут не соответствовать результатам в предыдущих версиях .NET Framework. Это изменение в первую очередь влияет на слоги языка чероки, а также знаки гласных и обозначения тонов в новой письменности Тай-Лю.

Предложение

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

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

Затронутые API

Безопасность

RSACng и DSACng снова могут использоваться в сценариях частичного доверия

Сведения

CngLightup (используется в нескольких высокоуровневых API шифрования, таких как System.Security.Cryptography.Xml.EncryptedXml) и System.Security.Cryptography.RSACng в некоторых случаях требуют полного доверия. К ним относятся вызовы P/Invoke без утверждения разрешений SecurityPermissionFlag.UnmanagedCode, а также пути кода, в которых System.Security.Cryptography.CngKey предъявляет требования к разрешениям для SecurityPermissionFlag.UnmanagedCode. Начиная с версии .NET Framework 4.6.2, CngLightup по возможности используется для переключения на System.Security.Cryptography.RSACng. В результате приложения с частичным доверием, которые успешно использовали System.Security.Cryptography.Xml.EncryptedXml, могут завершаться сбоем с исключениями SecurityException. Это изменение добавляет необходимые утверждения, благодаря чему все функции, использующие CngLightup, получают соответствующие разрешения.

Предложение

Если это изменение в .NET Framework 4.6.2 затронуло ваши приложения с частичным доверием, выполните обновление до версии .NET Framework 4.7.1.

Имя. Значение
Область Microsoft Edge
Версия 4.6.2
Тип Параметры выполнения

Затронутые API

RSACng.VerifyHash теперь возвращает значение False при любом сбое проверки

Сведения

Начиная с .NET Framework 4.6.2 этот метод возвращает False, если сама подпись неверно форматирована. Теперь он возвращает значение false при любом сбое проверки. В .NET Framework 4.6 и 4.6.1 этот метод выдает System.Security.Cryptography.CryptographicException, если сама подпись имеет неправильный формат.

Предложение

Любой код, выполнение которого зависит от обработки System.Security.Cryptography.CryptographicException, следует изменить так, чтобы он выполнялся, когда проверка завершается неудачей и метод возвращает False.

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

Затронутые API

Критические изменения в SignedXml и EncryptedXml

Сведения

Исправления системы безопасности в .NET Framework 4.6.2 для System.Security.Cryptography.Xml.SignedXml и System.Security.Cryptography.Xml.EncryptedXml привели к различиям в поведении во время выполнения. Например:

  • Если документ содержит несколько элементов с одинаковым атрибутом id, один из которых является целевым корнем подписи, такой документ будет считаться недействительным.
  • Теперь недействительными считаются документы, использующие неканонические алгоритмы преобразования XPath в ссылках.
  • Теперь недействительными считаются документы, использующие неканонические алгоритмы преобразования XSLT в ссылках.
  • Любая программа, использующая удаленные с внешнего ресурса подписи, не сможет сделать это.

Предложение

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

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

Затронутые API

Windows Communication Foundation (WCF)

Удаление Ssl3 из WCF TransportDefaults

Сведения

При использовании NetTcp для обеспечения безопасности транспорта и применении типа учетных данных сертификата протокол SSL 3 больше не является протоколом по умолчанию для согласования безопасного соединения. В большинстве случаев существующие приложения не должны затрагиваться, так как протокол TLS 1.0 всегда входил в список протоколов для NetTcp. Все существующие клиенты должны иметь возможность согласовывать подключение с помощью TLS версии не ниже 1.0.

Предложение

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

Имя. Значение
Область Microsoft Edge
Версия 4.6.2
Тип Параметры выполнения

Затронутые API

Windows Presentation Foundation (WPF)

Изменение свойства IsEnabled для родительского объекта элемента управления TextBlock влияет на любые дочерние элементы управления

Сведения

Начиная с версии .NET Framework 4.6.2, изменение свойства System.Windows.UIElement.IsEnabled родительского объекта элемента управления System.Windows.Controls.TextBlock влияет на любые дочерние элементы управления (например, гиперссылки и кнопки) элемента System.Windows.Controls.TextBlock. В .NET Framework 4.6.1 и более ранних версий элементы управления внутри элемента System.Windows.Controls.TextBlock не всегда отражали состояние свойства System.Windows.UIElement.IsEnabled родительского объекта System.Windows.Controls.TextBlock.

Предложение

Нет. Это изменение соответствует ожидаемому поведению для элементов управления, содержащихся внутри элемента управления System.Windows.Controls.TextBlock.

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

Затронутые API

CoerceIsSelectionBoxHighlighted

Сведения

Некоторые последовательности действий, в которых используются System.Windows.Controls.ComboBox и соответствующий источник данных, могут привести к исключению System.NullReferenceException.

Предложение

По возможности выполните обновление до .NET Framework 4.6.2.

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

Затронутые API

DataGridCellsPanel.BringIndexIntoView создает исключение ArgumentOutOfRangeException

Сведения

Метод ScrollIntoView(Object) будет выполняться асинхронно, если виртуализация столбцов включена, но ширина столбцов еще не определена. Если столбцы удаляются до завершения асинхронной операции, может возникнуть исключение System.ArgumentOutOfRangeException.

Предложение

Выполните одно из следующих действий:

  • Выполните обновление до .NET Framework 4.7.
  • Установите последнее служебное исправление для .NET Framework 4.6.2.
  • Избегать удаления столбцов до завершения асинхронного ответа на метод ScrollIntoView(Object).
Имя. Значение
Область Microsoft Edge
Версия 4.6.2
Тип Параметры выполнения

Затронутые API

Горизонтальная прокрутка и виртуализация

Сведения

Это изменение применяется к System.Windows.Controls.ItemsControl тому, что выполняет собственную виртуализацию в направлении ортогонального направления к основному направлению прокрутки (главным примером является System.Windows.Controls.DataGrid EnableColumnVirtualization="True"). Результат некоторых операций горизонтальной прокрутки был изменен для получения результатов, которые являются более интуитивно понятными и более подобными результатам сопоставимых вертикальных операций.

К операциям относятся "Прокрутка здесь" и "Правый край", чтобы использовать имена из меню, полученного путем щелчка правой кнопкой мыши горизонтальной полосы прокрутки. Обе они вычисляют предполагаемое смещение и вызывают SetHorizontalOffset(Double).

После прокрутки до нового смещения понятие "здесь" или "правый край" может измениться, так как только что де-виртуализированное содержимое изменило значение System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth.

До платформа .NET Framework 4.6.2 операция прокрутки просто использует смещение кандидата, даже если оно больше не может быть "здесь" или на правом краю. Его результаты проявляются в виде "подпрыгивания" бегунка прокрутки. Лучше всего это проиллюстрировать на примере. Допустим, для System.Windows.Controls.DataGrid заданы значения ExtentWidth=1000 и Width=200. При прокрутке "К правому краю" используется смещение кандидата 1000 – 200 = 800. В процессе прокрутки к этому смещению девиртуализируются новые столбцы. Предположим, что они очень широкие, и теперь свойство System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth получает значение 2000. Прокрутка заканчивается горизонтальнымoffset=800, и большой палец "отскочит" назад к середине полосы прокрутки - точно в 800/2000 = 40 %.

Это изменение позволяет повторно вычислить новое предполагаемое смещение в такой ситуации и повторить попытку. (Так уже работает вертикальная прокрутка.)

Это поведение стало более прогнозируемым и интуитивно понятным для конечного пользователя, но изменение может повлиять на те приложения, которые ожидают конкретных значений свойства System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset после горизонтальной прокрутки, вызванной действиями пользователя или прямым вызовом SetHorizontalOffset(Double).

Предложение

Нужно изменить приложения, использующие прогнозируемое значение для System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset, чтобы они извлекали фактическое значение (а также значение System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth) после любой горизонтальной прокрутки, при которой System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth может измениться из-за девиртуализации.

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

Затронутые API

Items.Clear не удаляет дубликаты из SelectedItems

Сведения

Если в элементе Selector, поддерживающем выбор нескольких элементов, в коллекции System.Windows.Controls.Primitives.MultiSelector.SelectedItems присутствуют дубликаты, один и тот же элемент присутствует несколько раз. Удаление этих элементов из источника данных (например, путем вызова Items.Clear) не приведет к их удалению из коллекции System.Windows.Controls.Primitives.MultiSelector.SelectedItems. Будет удален только первый экземпляр. Более того, последующее использование коллекции System.Windows.Controls.Primitives.MultiSelector.SelectedItems, например вызов SelectedItems.Clear(), может вызвать проблемы, например исключение System.ArgumentException, так как коллекция System.Windows.Controls.Primitives.MultiSelector.SelectedItems содержит элементы, которые отсутствуют в источнике данных.

Предложение

По возможности выполните обновление до .NET 4.6.2.

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

Затронутые API

Поэлементная прокрутка плоского списка с элементами, имеющими различную высоту в пикселях

Сведения

Когда System.Windows.Controls.ItemsControl отображает коллекцию с помощью виртуализации (IsVirtualizing=true) и прокрутки элемента (ScrollUnit=Item) и когда элемент управления прокручивается для отображения элемента, высота которого в пикселях отличается о высоты соседних элементов, System.Windows.Controls.VirtualizingStackPanel выполняет итерацию по всем элементам в коллекции. При выполнении этой итерации пользовательский интерфейс не отвечает на запросы. Такая итерация происходит и в других ситуациях, даже в более ранних выпусках .NET Framework. Например, она происходит при пиксельной прокрутке (ScrollUnit=Pixel) при обнаружении элемента другой высоты в пикселях, а также при поэлементной прокрутке иерархических данных (например, в элементе управления System.Windows.Controls.TreeView или System.Windows.Controls.ItemsControl с включенным группированием) при обнаружении элемента, число подчиненных элементов которого отличается от соседних элементов. Для поэлементной прокрутки элементов с разной высотой в пикселях эта итерация была представлена в .NET Framework 4.6.1, чтобы устранить ошибки, связанные с макетом иерархических данных. Итерация не требуется, если данные не структурированы (без иерархии), и в этом случае .NET Framework 4.6.2 не выполняет ее.

Предложение

Если итерация выполняется в .NET Framework 4.6.1, но не в более ранних выпусках, т. е. если System.Windows.Controls.ItemsControl прокручивает поэлементно плоский список с элементами разной высоты в пикселях, то существует два решения:

  • Установите .NET Framework 4.6.2.
  • Установите исправление HR 1605 для .NET Framework 4.6.1.
Имя. Значение
Область Незначительный
Версия 4.6.1
Тип Параметры выполнения

Затронутые API

В локализованных сборках для RibbonGroup устанавливается прозрачный фон

Сведения

Фон System.Windows.Controls.Ribbon.RibbonGroup в локализованных сборках всегда закрашивается с использованием прозрачной кисти, что ухудшает восприятие пользовательского интерфейса. Решение приведено в исправлении WPF в .NET Framework 4.7, где были обновлены локализованные ресурсы для System.Windows.Controls.Ribbon.RibbonGroup, благодаря чему гарантируется выбор правильной кисти.

Предложение

Выполните обновление до .NET Framework 4.7.

Имя. Значение
Область Microsoft Edge
Версия 4.6.2
Тип Параметры выполнения

Затронутые API

Невозможно обнаружить с помощью анализа API.

Проверка орфографии WPF завершается сбоем непредвиденным образом

Сведения

Сюда относится целый ряд проблем, связанных со средством проверки орфографии WPF:

  • В некоторых случаях средство проверки орфографии WPF создает исключение System.Runtime.InteropServices.COMException
  • Средство проверки орфографии WPF завершается сбоем с исключением UnauthorizedAccessException при запуске приложений с использованием параметра "Запуск от имени другого пользователя"
  • Средство проверки орфографии WPF неверно определяет орфографические ошибки в составных словах, например "Hausnummer" в немецком языке.

Предложение

Проблема 1. Эта проблема исправлена в .NET Framework 4.6.2. Проблема 2. Средство проверки орфографии WPF больше не поддерживается при запуске приложений с использованием параметра "Запуск от имени другого пользователя". Начиная с версии .NET Framework 4.6.2, работа запускаемых таким образом приложений не завершается непредвиденным сбоем. Вместо этого средство проверки орфографии автоматически отключается. Проблема 3. Эта проблема была исправлена в версии .NET Framework 4.6.2.

Имя. Значение
Область Microsoft Edge
Версия 4.6.1
Тип Параметры выполнения

Затронутые API

Невозможно обнаружить с помощью анализа API.