Изменения среды выполнения для миграции в .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.DataContractSerializer другой сериализатор System.Runtime.Serialization.NetDataContractSerializer. Кроме того, поскольку эта проблема была устранена в .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). Начиная с .NET Framework 4.6 атрибуты свойства будут правильно возвращены.

Предложение

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

Имя Ценность
Область действия Microsoft Edge
Версия 4,6
Тип Режим выполнения

Затронутые API

Профилировщиками не перечисляются COR_PRF_GC_ROOT_HANDLEs.

Сведения

В .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.

Слушатели событий ETW не фиксируют события от поставщиков с явными ключевыми словами, таких как поставщик TPL.

Сведения

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

Предложение

Чтобы обойти эту проблему, замените вызовы на перегрузку функции 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 класс использует солнечный алгоритм Хиджри. Преобразование дат между System.Globalization.PersianCalendar и другими календарями может привести к немного другому результату, начиная с .NET Framework 4.6 для дат ранее 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 был передан для подробного параметра, и были установлены сертификаты, которые не поддерживаются платформой .NET Framework. Теперь метод будет успешно выполнен и возвращает допустимую строку, которая не содержит недоступных частей сертификата.

Предложение

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

Имя Ценность
Область действия Microsoft Edge
Версия 4,6
Тип Режим выполнения

Затронутые API

Данные

Попытка подключения 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 DateTimes возвращает немного другую строку

Сведения

Строковые представления объекта System.Net.Mime.ContentDisposition были обновлены, начиная с версии 4.6, чтобы компонент часа в System.DateTime всегда представлялся двумя цифрами. Это должно соответствовать RFC822 и RFC2822. Это приводит к тому, что ToString() в версии 4.6 возвращает немного другую строку в ситуациях, когда один из временных элементов назначения был до 10:00 утра. Обратите внимание, что «ContentDispositions» иногда сериализуются путем преобразования их в строки, поэтому следует проверять все ToString() operations, сериализацию или вызовы 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), он возвращает строку версии 4.0.30319.
Имя Ценность
Область действия Несовершеннолетний
Версия 4,6
Тип Режим выполнения

Затронутые API

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

Платформа .NET Framework 4.6 не использует версию 4.5.x.x.x при регистрации в реестре.

Сведения

Как ожидается, ключ версии, заданный в реестре (at 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.5, чтобы также поддерживать версию 4.6.

Имя Ценность
Область действия Microsoft Edge
Версия 4,6
Тип Режим выполнения

Затронутые API

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

Windows Communication Foundation (WCF)

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

Сведения

Платформа .NET Framework 4.6 добавляет TLS 1.1 и TLS 1.2 в список протоколов WCF по умолчанию. Если на клиентских и серверных компьютерах установлена платформа .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 может привести к исключению NullReferenceException.

Сведения

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

Предложение

Эта проблема была устранена в .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. Эта проблема устранена в .NET Framework 4.6.

Предложение

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

Ценность
Объем Несовершеннолетний
Версия 4,5
Тип Режим выполнения

Затронутые API

ПриведениеВыделенияДолжноБытьПодсвечено

Сведения

Некоторые последовательности действий с 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, которые обрезали окна WPF, выходившие за пределы одного дисплея.

Предложение

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

Имя Ценность
Область действия Несовершеннолетний
Версия 4,6
Тип Режим выполнения

Затронутые API

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

.NET Framework 4.6.1

Инструменты

Contract.Invariant или Contract.Requires<TException> не считают String.IsNullOrEmpty неизменной

Сведения

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

Предложение

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

Имя Ценность
Область действия Несовершеннолетний
Версия 4.6.1
Тип Режим выполнения

Затронутые API

Windows Presentation Foundation (WPF)

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

Сведения

Когда System.Windows.Controls.ItemsControl отображает коллекцию с помощью виртуализации (IsVirtualizing=true) и прокрутки элементов (ScrollUnit=Item), а также когда элемент управления прокручивается для отображения элемента, высота которого в пикселях отличается от его соседей, System.Windows.Controls.VirtualizingStackPanel выполняет итерацию по всем элементам в коллекции. Пользовательский интерфейс не отвечает во время этой итерации. Итерация возникает в других обстоятельствах, даже в предыдущих выпусках .NET Framework. Например, это происходит при pixel-прокрутке (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 иногда завершают работу сбоем во время завершения работы приложения из-за исключения, вызванного средством проверки орфографии. Это исправлено в .NET Framework 4.7 WPF путем корректной обработки исключения и обеспечения того, чтобы приложения больше не пострадали. Следует отметить, что случайные исключения первого шанса продолжают наблюдаться в приложениях, работающих под отладчиком.

Предложение

Обновление до .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

Данные

Попытка подключения 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.

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

Сведения

Начиная с .NET Framework 4.6.2, для открытых запросов к известным базам данных SQL Azure (*.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/Invokes без утверждения 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, следует выполнить, если проверка завершается ошибкой, а метод возвращает Ложь.

Имя Ценность
Область действия Несовершеннолетний
Версия 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. Все существующие клиенты должны иметь возможность согласовывать подключение с помощью по крайней мере TLS1.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

ПриведениеВыделенияДолжноБытьПодсвечено

Сведения

Некоторые последовательности действий с 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. Прокрутка до "Right Edge" использует смещение кандидата 1000 – 200 = 800. При прокрутке до этого смещения новые столбцы перестают быть виртуальными; допустим, они очень широкие, так что System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth изменяется до 2000. Прокрутка заканчивается с HorizontalOffset=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. Например, это происходит при pixel-прокрутке (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.