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

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

.NET Framework 4.7

JIT

Некорректное формирование кода при передаче и сравнении значений UInt16

Сведения

Из-за изменений, представленных в версии .NET Framework 4.7, в некоторых случаях созданный JIT-компилятором код в приложениях на платформе .NET Framework 4.7 некорректно сравнивает значения T:System.UInt16. Дополнительные сведения см. в статье Проблема № 11508. Некорректное автоматическое формирование кода при передаче и сравнении аргументов ushort на веб-сайте GitHub.com.

Предложение

Если вы сталкиваетесь с проблемами при сравнении 16-разрядных значений без знака в .NET Framework 4.7, выполните обновление до .NET Framework 4.7.1.

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

Затронутые API

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

Windows Presentation Foundation (WPF)

Сбой в селекторе при удалении элемента из пользовательской коллекции INCC

Сведения

T:System.InvalidOperationException может возникнуть в следующих сценариях:

  • ItemsSource для T:System.Windows.Controls.Primitives.Selector является коллекцией с пользовательской реализацией T:System.Collections.Specialized.INotifyCollectionChanged.
  • Выбранный элемент удаляется из коллекции.
  • Для T:System.Collections.Specialized.NotifyCollectionChangedEventArgs установлено P:System.Collections.Specialized.NotifyCollectionChangedEventArgs.OldStartingIndex = –1 (что указывает на неизвестную позицию).

Стек вызовов исключения начинает at System.Windows.Threading.Dispatcher.VerifyAccess() at System.Windows.DependencyObject.GetValue(DependencyProperty dp) at System.Windows.Controls.Primitives.Selector.GetIsSelected(DependencyObject element). Это исключение может возникать на платформе .NET Framework 4.5, если приложение содержит больше одного потока Dispatcher. В .Net Framework 4.7 исключение также может возникнуть в приложениях с одним потоком Dispatcher.

Проблема устранена в .Net Framework 4.7.1.

Предложение

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

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

Затронутые API

Невозможно обнаружить с помощью анализа 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

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

Сведения

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

Предложение

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

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

Затронутые API

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

Изменение размеров сетки может привести к зависанию приложения

Сведения

При изменении макета T:System.Windows.Controls.Grid в следующих обстоятельствах может возникать бесконечный цикл:

  • Определения строк содержат два атрибута *-rows, которые объявляют значения MinHeight и MaxHeight.
  • Содержимое строк *-rows не превышает соответствующее Значение MaxHeight.
  • Первое значение MinHeight (плюс любые другие фиксированные или автоматические строки) превышает доступную высоту сетки.
  • Приложение предназначено для .NET Framework 4.7 или использует алгоритм выделения версии 4.7, включенный с помощью параметра Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false.

Кроме того, цикл может возникать при наличии более двух строк или в аналогичных случаях для столбцов. Проблема устранена в .Net Framework 4.7.1.

Предложение

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

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
Имя. Значение
Область Microsoft Edge
Версия 4,7
Тип Параметры выполнения

Затронутые API

Невозможно обнаружить с помощью анализа 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

Сведения

API-интерфейсы WPF для печати, использующие System.Printing.PrintQueue, теперь вызывают API пакета печати документа Windows вместо устаревшего API печати XPS. Это изменение внесено в целях повышения удобства обслуживания. Ни пользователи, ни разработчики не должны заметить какие-либо изменения в поведении или использовании API. Новый стек печати по умолчанию активируется при работе с обновлением Windows 10 Creators Update. Старый стек печати по-прежнему будет работать в предыдущих версиях Windows, как и раньше.

Предложение

Чтобы использовать старый стек в Windows 10 Creators Update, задайте значение UseXpsOMPrinting REG_DWORD в разделе реестра HKEY_CURRENT_USER\Software\Microsoft\.NETFramework\Windows Presentation Foundation\Printing равным 1.

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

Затронутые API

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

Windows Workflow Foundation (WF)

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

Сведения

В .NET Framework 4.6.2 и более ранних версий в тех случаях, когда метод Execute действия рабочего процесса создает исключение со значением null для свойства Message, среда выполнения рабочего процесса System.Activities создает исключение System.NullReferenceException, маскируя исходное исключение. В версии .NET Framework 4.7 создается ранее маскированное исключение.

Предложение

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

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

Затронутые API

Функция сохраняемости SQL для рабочего процесса добавляет кластеры первичных ключей и не допускает значения NULL в некоторых столбцах

Сведения

Начиная с версии .NET Framework 4.7, таблицы, созданные для хранилища экземпляров рабочего процесса SQL (SWIS) с помощью скрипта SqlWorkflowInstanceStoreSchema.sql, используют кластеризованные первичные ключи. Из-за этого удостоверения не поддерживают значения null. Это изменение не влияет на работу SWIS. Были внесены обновления в поддержку механизма репликации транзакций SQL Server.

Предложение

Чтобы реализовать это изменение, в существующую установку необходимо добавить SQL-файл SqlWorkflowInstanceStoreSchemaUpgrade.sql. В новых установках баз данных это изменение реализуется автоматически.

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

Затронутые API

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

.NET Framework 4.7.1

JIT

Некорректное формирование кода при передаче и сравнении значений UInt16

Сведения

Из-за изменений, представленных в версии .NET Framework 4.7, в некоторых случаях созданный JIT-компилятором код в приложениях на платформе .NET Framework 4.7 некорректно сравнивает значения T:System.UInt16. Дополнительные сведения см. в статье Проблема № 11508. Некорректное автоматическое формирование кода при передаче и сравнении аргументов ushort на веб-сайте GitHub.com.

Предложение

Если вы сталкиваетесь с проблемами при сравнении 16-разрядных значений без знака в .NET Framework 4.7, выполните обновление до .NET Framework 4.7.1.

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

Затронутые API

Невозможно обнаружить с помощью анализа 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

Windows Communication Foundation (WCF)

WCF AddressHeaderCollection теперь создает исключение ArgumentException, если элемент addressHeader равен NULL

Сведения

Начиная с версии .NET Framework 4.7.1, конструктор AddressHeaderCollection(IEnumerable<AddressHeader>) создает исключение ArgumentException, если один из элементов равен null. В версии .NET Framework 4.7 и более ранних исключение не создается.

Предложение

Если из-за этого изменения в .NET Framework 4.7.1 или более поздних версий вы сталкиваетесь с проблемами совместимости, вы можете отключить его, добавив следующую строку в раздел <runtime> файла app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableAddressHeaderCollectionValidation=true" />
  </runtime>
</configuration>
Имя. Значение
Область Незначительный
Версия 4.7.1
Тип Параметры выполнения

Затронутые API

MsmqSecureHashAlgorithm WCF теперь по умолчанию имеет значение SHA256

Сведения

Начиная с версии .NET Framework 4.7.1, в WCF для подписывания сообщений Msmq по умолчанию используется алгоритм SHA256. В .NET Framework 4.7 и более ранних версий для подписывания сообщений по умолчанию используется алгоритм SHA1.

Предложение

Если из-за этого изменения в .NET Framework 4.7.1 или более поздних версий вы сталкиваетесь с проблемами совместимости, вы можете отключить это изменение, добавив следующую строку в раздел <runtime> файла app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.UseSha1InMsmqEncryptionAlgorithm=true" />
  </runtime>
</configuration>
Имя. Значение
Область Незначительный
Версия 4.7.1
Тип Параметры выполнения

Затронутые API

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

WCF PipeConnection.GetHashAlgorithm теперь использует SHA256

Сведения

Начиная с версии .NET Framework 4.7.1 Windows Communication Foundation использует хэш SHA256 для формирования случайных имен для именованных каналов. В .NET Framework 4.7 и более ранних версиях используется хэш SHA-1.

Предложение

Если из-за этого изменения в .NET Framework 4.7.1 или более поздних версий вы сталкиваетесь с проблемами совместимости, вы можете отключить это изменение, добавив следующую строку в раздел <runtime> файла app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.UseSha1InPipeConnectionGetHashAlgorithm=true" />
  </runtime>
</configuration>
Имя. Значение
Область Незначительный
Версия 4.7.1
Тип Параметры выполнения

Затронутые API

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

Windows Presentation Foundation (WPF)

Связанные всплывающие окна с StaysOpen=False

Сведения

Всплывающее окно с StaysOpen=False должно закрываться при щелчке за пределами всплывающего окна. Если несколько таких всплывающих окон связаны по цепочке (например, одно содержит другое), возникает множество проблем, в том числе следующие:

  • Откройте два уровня и щелкните вне окна P2, но внутри окна P1. Ничего не происходит.
  • Откройте два уровня и щелкните вне окна P1. Оба всплывающих окна закроются.
  • Откройте и закройте два уровня. Теперь попытайтесь снова открыть окно P2. Ничего не происходит.
  • Попробуйте открыть три уровня. Это невозможно. (В зависимости от места щелчка, либо ничего не происходит, либо первые два уровня закрываются.)

Теперь поведение окон в этих и других случаях исправлено.

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

Затронутые API

Сбой в селекторе при удалении элемента из пользовательской коллекции INCC

Сведения

T:System.InvalidOperationException может возникнуть в следующих сценариях:

  • ItemsSource для T:System.Windows.Controls.Primitives.Selector является коллекцией с пользовательской реализацией T:System.Collections.Specialized.INotifyCollectionChanged.
  • Выбранный элемент удаляется из коллекции.
  • Для T:System.Collections.Specialized.NotifyCollectionChangedEventArgs установлено P:System.Collections.Specialized.NotifyCollectionChangedEventArgs.OldStartingIndex = –1 (что указывает на неизвестную позицию).

Стек вызовов исключения начинает at System.Windows.Threading.Dispatcher.VerifyAccess() at System.Windows.DependencyObject.GetValue(DependencyProperty dp) at System.Windows.Controls.Primitives.Selector.GetIsSelected(DependencyObject element). Это исключение может возникать на платформе .NET Framework 4.5, если приложение содержит больше одного потока Dispatcher. В .Net Framework 4.7 исключение также может возникнуть в приложениях с одним потоком Dispatcher.

Проблема устранена в .Net Framework 4.7.1.

Предложение

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

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

Затронутые API

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

Изменение размеров сетки может привести к зависанию приложения

Сведения

При изменении макета T:System.Windows.Controls.Grid в следующих обстоятельствах может возникать бесконечный цикл:

  • Определения строк содержат два атрибута *-rows, которые объявляют значения MinHeight и MaxHeight.
  • Содержимое строк *-rows не превышает соответствующее Значение MaxHeight.
  • Первое значение MinHeight (плюс любые другие фиксированные или автоматические строки) превышает доступную высоту сетки.
  • Приложение предназначено для .NET Framework 4.7 или использует алгоритм выделения версии 4.7, включенный с помощью параметра Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false.

Кроме того, цикл может возникать при наличии более двух строк или в аналогичных случаях для столбцов. Проблема устранена в .Net Framework 4.7.1.

Предложение

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

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
Имя. Значение
Область Microsoft Edge
Версия 4,7
Тип Параметры выполнения

Затронутые API

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

.NET Framework 4.7.2.

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

Разрешение Юникода в URI, которые напоминают общие папки UNC

Сведения

В System.Uri формирование URI файла, содержащего UNC-имя общей папки и символы Юникода, больше не приводит к созданию URI с недопустимым внутренним состоянием. Это поведение изменится, только если выполняются все указанные ниже условия:

  • URI имеет схему file: и за ним следуют четыре или более косых черт;
  • имя узла начинается с символа подчеркивания или другого незарезервированного символа;
  • URI содержит символы Юникода.

Предложение

Приложения, работающие с URI, в обязательном порядке содержащими символы Юникода, потенциально могли использовать это поведение для запрета ссылок на общие папки UNC. Эти приложения должны использовать IsUnc.

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

Затронутые API

Поддержка нотации специального относительного URI при наличии символов Юникода

Сведения

Uri больше не будет создавать исключение NullReferenceException при вызове TryCreate для определенных относительных URI, содержащих символы Юникода. Простое воспроизведение NullReferenceException представлено ниже (с двумя эквивалентными инструкциями):

bool success = Uri.TryCreate("http:%C3%A8", UriKind.RelativeOrAbsolute, out Uri href);
bool success = Uri.TryCreate("http:è", UriKind.RelativeOrAbsolute, out Uri href);

Для воспроизведения NullReferenceException должны выполняться следующие условия:

  • URI должен быть указан как относительный: с префиксом "http:", за которым не следуют две косые черты "//".
  • URI должен содержать незарезервированные символы или символы Юникода, закодированные процентами.

Предложение

Пользователям, зависящим от этого поведения, для запрета относительных URI следует указывать UriKind.Absolute при создании URI.

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

Затронутые API

Параметры выполнения

Улучшенная проверка цепочки сертификатов WCF для проверки подлинности сертификатов в Net.Tcp

Сведения

В .NET Framework 4.7.2 улучшена проверка цепочки сертификатов при использовании проверки подлинности сертификатов с защитой транспорта в WCF. В связи с этим усовершенствованием сертификаты клиента, которые используются для проверки подлинности на сервере, необходимо настроить для проверки подлинности клиента. Аналогичным образом сертификаты сервера, которые используются для проверки подлинности сервера, необходимо настроить для проверки подлинности сервера. В результате этого изменения проверка цепочки сертификатов завершается ошибкой, если корневой сертификат отключен. Это же изменение вносилось в .NET Framework 3.5 и более поздних версий с помощью свертки безопасности Windows. Дополнительные сведения можно найти здесь. Это изменение включено по умолчанию. Его можно отключить с помощью параметра конфигурации.

Предложение

  • Проверьте, есть ли у сертификатов сервера и клиента необходимые OID EKU. Если нет, обновите сертификаты.

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

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

    <appSettings>
      <add key="wcf:useLegacyCertificateUsagePolicy" value="true" />
    </appSettings>
    
Имя. Значение
Область Незначительный
Версия 4.7.2
Тип Параметры выполнения

Затронутые API

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

веб-приложения

Параметр приложения "dataAnnotations:dataTypeAttribute:disableRegEx" по умолчанию включен в .NET Framework 4.7.2

Сведения

В .NET Framework 4.6.1 появился новый параметр приложения (dataAnnotations:dataTypeAttribute:disableRegEx), который позволяет пользователям отключать регулярные выражения в атрибутах типов данных (таких как System.ComponentModel.DataAnnotations.EmailAddressAttribute, System.ComponentModel.DataAnnotations.UrlAttribute и System.ComponentModel.DataAnnotations.PhoneAttribute). Это помогает сделать приложения менее уязвимыми, в частности для атак типа "отказ в обслуживании" с использованием определенных регулярных выражений.
В .NET Framework 4.6.1 этот параметр, запрещающий использование RegEx, по умолчанию имел значение false. Начиная с версии .NET Framework 4.7.2, эта настройка по умолчанию переведена в значение true. Это обеспечивает дополнительную защиту от уязвимостей для приложений, разрабатываемых с использованием .NET Framework 4.7.2.

Предложение

Если после перехода на версию .NET Framework 4.7.2 вы обнаружите, что регулярные выражения в вашем веб-приложении перестали работать, вы можете изменить значение dataAnnotations:dataTypeAttribute:disableRegEx на false и вернуться к предыдущему режиму работы.

<configuration>
<appSettings>
...
<add key="dataAnnotations:dataTypeAttribute:disableRegEx" value="false"/>
...
</appSettings>
</configuration>
Имя. Значение
Область Незначительный
Версия 4.7.2
Тип Параметры выполнения

Затронутые API

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

Windows Presentation Foundation (WPF)

Улучшенные подсказки клавиш в WPF

Сведения

Поведение подсказок клавиш было изменено и теперь совпадает с поведением в проводнике и Microsoft Word. WPF проверяет, включено ли состояние подсказки клавиш в случае, если нажата SystemKey (в частности, Key или F11), и обрабатывает клавиши подсказок соответствующим образом. Подсказки клавиш теперь закрывают меню, даже если оно открыто с помощью мыши.

Предложение

Н/П

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

Затронутые API

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