Изменения среды выполнения для миграции на платформа .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
- CodeActivity.Execute(CodeActivityContext)
- AsyncCodeActivity.BeginExecute(AsyncCodeActivityContext, AsyncCallback, Object)
- AsyncCodeActivity<TResult>.BeginExecute(AsyncCodeActivityContext, AsyncCallback, Object)
- WorkflowInvoker.Invoke()
Функция сохраняемости 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
- DSACng(CngKey)
- DSACng.Key
- DSACng.LegalKeySizes
- DSACng.CreateSignature(Byte[])
- DSACng.VerifySignature(Byte[], Byte[])
- RSACng(CngKey)
- RSACng.Key
- RSACng.Decrypt(Byte[], RSAEncryptionPadding)
- RSACng.SignHash(Byte[], HashAlgorithmName, RSASignaturePadding)
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.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по