Изменения среды выполнения для миграции в .NET Framework 4.8.x
В этой статье перечислены проблемы совместимости приложений, представленные в .NET Framework 4.8 и 4.8.1.
.NET Framework 4.8
ASP.NET
ASP.NET исправление обработки атрибутов InputAttributes и LabelAttributes для элемента управления CheckBox в WebForms
Подробности
Для приложений, предназначенных для .NET Framework 4.7.2 и более ранних версий, CheckBox.InputAttributes и CheckBox.LabelAttributes, которые программно добавляются в элемент управления WebForms CheckBox, теряются после обратной передачи. Для приложений, предназначенных для .NET Framework 4.8 или более поздних версий, они сохраняются после обратной передачи.
Предложение
Для корректного восстановления атрибутов при обратной отправке установите targetFrameworkVersion
на 4.8 или выше. Например:
<configuration>
<system.web>
<httpRuntime targetFramework="4.8"/>
</system.web>
</configuration>
Установка на более низкое значение или полное отключение сохраняет старое неправильное поведение.
Имя | Ценность |
---|---|
Размах | Неизвестный |
Версия | 4.8 |
Тип | Среда выполнения |
Затронутые API
Неправильная обработка многокомпонентных данных в ASP.NET может привести к потере данных формы.
Подробности
В приложениях, предназначенных для .NET Framework 4.7.2 и более ранних версий, ASP.NET могут неправильно анализировать значения границ с несколькими частями, что приводит к недоступности данных формы во время выполнения запроса. Приложения, предназначенные для .NET Framework 4.8 или более поздней версии, правильно анализируют многопартийные данные, поэтому значения форм доступны во время выполнения запроса.
Предложение
Начиная с приложений, работающих на .NET Framework 4.8, при выборе платформы .NET Framework 4.8 или более поздней версии с помощью элемента targetFrameworkVersion
, поведение по умолчанию изменяется и начинается удаление разделителей. При нацеливании на предыдущие версии платформы или неиспользовании targetFrameworkVersion
, для некоторых значений по-прежнему возвращаются конечные разделители.
Это поведение также можно явно контролировать с помощью appSetting
:
<configuration>
<appSettings>
...
<add key="aspnet:UseLegacyMultiValueHeaderHandling" value="true"/>
...
</appSettings>
</configuration>
Имя | Ценность |
---|---|
Размах | Неизвестный |
Версия | 4.8 |
Тип | Среда выполнения |
Затронутые API
ASP.NET ValidationContext.MemberName не имеет значения NULL при использовании пользовательского DataAnnotations.ValidationAttribute
Подробности
В .NET Framework 4.7.2 и более ранних версиях при использовании пользовательского System.ComponentModel.DataAnnotations.ValidationAttributeсвойство ValidationContext.MemberName возвращает null
. В .NET Framework 4.8 до обновления за октябрь 2019 г. он возвращает имя члена. Начиная с .NET Framework за октябрь 2019 г. предварительная версия пакета исправлений для .NET Framework 4.8, она возвращает null
по умолчанию, но вместо этого можно выбрать его имя.
Предложение
Добавьте следующий параметр в файл web.config для возврата имени участника в .NET Framework за октябрь 2019 г. предварительная версия пакета исправлений для .NET Framework 4.8 и более поздних версий:
<configuration>
<appSettings>
...
<add key="aspnet:GetValidationMemberName" value="true"/>
...
</appSettings>
</configuration>
В версии .NET Framework 4.8 до обновления за октябрь 2019 г. добавление этого в файл web.config восстанавливает предыдущее поведение, а свойство возвращает null
.
Имя | Ценность |
---|---|
Размах | Неизвестный |
Версия | 4.8 |
Тип | Рантайм |
Затронутые API
Ядро
.NET COM успешно маршалирует параметры ByRef SafeArray в событиях
Подробности
В .NET Framework 4.7.2 и более ранних версиях параметр ByRef SafeArray в событии COM не мог маршалироваться обратно в нативный код. С этим изменением SafeArray теперь успешно маршалируется.
- [ x ] Quirked
Предложение
Если правильно маршалировать параметры ByRef SafeArray в COM-событиях прерывает выполнение, вы можете отключить этот код путем добавления следующего параметра конфигурации в файл конфигурации вашего приложения:
<appSettings>
<add key="Switch.System.Runtime.InteropServices.DoNotMarshalOutByrefSafeArrayOnInvoke" value="true" />
</appSettings>
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.8 |
Тип | Время выполнения |
Затронутые API
Невозможно обнаружить с помощью анализа API.
Взаимодействие .NET теперь выполнит запрос к IAgileObject (интерфейс WinRT)
Подробности
При использовании события WinRT с делегатом .NET Windows выполнит QueryInterface (QI) для IAgileObject, начиная с версии .NET Framework 4.8. В предыдущих версиях .NET Framework среда выполнения не справлялась с вызовом QI, и на событие нельзя было подписаться.
- [ x ] Quirked
Предложение
Если включение QI для IAgileObject прерывает выполнение, этот код можно отключить, задав следующую конфигурацию.
Метод 1. Переменная среды
Задайте следующую переменную среды: COMPLUS_DisableCCWSupportIAgileObject=1
Этот метод влияет на любую среду, наследующую эту переменную среды. Это может быть только один сеанс консоли или может повлиять на весь компьютер, если вы устанавливаете переменную среды глобально. Имя переменной окружения не чувствительно к регистру.
Метод 2. Реестр
Используя редактор реестра (regedit.exe), найдите любой из следующих подразделов:
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework
- HKEY_CURRENT_USER\SOFTWARE\Microsoft.NETFramework
Затем добавьте следующую запись:
Имя: DisableCCWSupportIAgileObject Тип: DWORD (32-разрядное) значение (также называемое REG_DWORD) Данные: 1
С помощью средства Windows REG.EXE можно добавить это значение из командной строки или среды сценариев. Например:
reg add HKLM\SOFTWARE\Microsoft.NETFramework /v DisableCCWSupportIAgileObject /t REG_DWORD /d 1
В этом случае HKLM
используется вместо HKEY_LOCAL_MACHINE
. Используйте reg add /?
для просмотра справки по этому синтаксису. Имя параметра реестра не чувствительно к регистру букв.
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.8 |
Тип | Среда выполнения |
Затронутые API
Невозможно обнаружить с помощью анализа API.
Windows Communication Foundation (WCF)
Изменение режима высокой контрастности в ComboBox svcTraceViewer
Подробности
В средстве просмотра трассировки Microsoft Service Trace Viewerэлементы управления ComboBox не отображались в правильном цвете в определенных темах высокой контрастности. Проблема устранена в .NET Framework 4.7.2. Однако из-за требований к обратной совместимости пакета SDK для .NET Framework исправление не было видно клиентам по умолчанию. .NET 4.8 отображает это изменение, добавив следующие параметры конфигурации AppContext в файл svcTraceViewer.exe.config:
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false" />
Предложение
Если вы не хотите изменить поведение высокой контрастности, его можно отключить, удалив следующий раздел из файла svcTraceViewer.exe.config:
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false" />
Имя | Ценность |
---|---|
Размах | Edge |
Версия | 4.8 |
Тип | Рантайм |
Затронутые API
Невозможно обнаружить с помощью анализа API.
Windows Presentation Foundation (WPF)
Улучшение привязки данных для KeyedCollection
Подробности
Исправлено Binding неправильное использование индексатора IList, когда исходный объект объявляет пользовательский индексатор с той же сигнатурой (например, KeyedCollection<int,TItem>
).
Предложение
Чтобы приложение, предназначенное для более старой версии, воспользоваться этим изменением, оно должно работать в .NET Framework 4.8 или более поздней версии, и оно должно принять решение об изменении, добавив следующий параметр AppContext в раздел <runtime>
файла конфигурации приложения и установив его на false
:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<!-- AppContextSwitchOverrides value attribute is in the form of key1=true/false;key2=true/false -->
<AppContextSwitchOverrides value="Switch.System.Windows.Data.Binding.IListIndexerHidesCustomIndexer=false" />
</runtime>
</configuration>
Имя | Ценность |
---|---|
Размах | Майор |
Версия | 4.8 |
Тип | Время выполнения |
Затронутые API
Невозможно обнаружить с помощью анализа API.
Исправлена проблема, когда ListBox перестает отвечать на запросы, если он содержит повторяющиеся типы значений
Подробности
Исправлена проблема, из-за которой виртуализация ItemsControl может перестать отвечать во время прокрутки, когда его коллекция Items
содержит повторяющиеся объекты, типизированные значениями.
Имя | Ценность |
---|---|
Размах | Майор |
Версия | 4.8 |
Тип | Время выполнения |
Затронутые API
Невозможно обнаружить с помощью анализа API.
Улучшения алгоритма распределения пространства для звёздных рядов сетки
Подробности
Исправлена ошибка в алгоритме распределения размеров дляв Grid, представленного в .NET Framework 4.7. В некоторых случаях, например сетка с Height="Auto"
, содержащей пустые строки, строки были упорядочены в неправильном положении, возможно, за пределами сетки вообще.
Предложение
Чтобы приложение пользовалось этими изменениями, оно должно работать в .NET Framework 4.8 или более поздней версии.
Имя | Ценность |
---|---|
Размах | Майор |
Версия | 4.8 |
Тип | Время выполнения |
Затронутые API
Невозможно обнаружить с помощью анализа API.
Улучшение навигации по клавиатуре в ListBox с гиперссылками
Подробности
Исправлен неправильный результат нажатия клавиши со стрелкой, когда фокус находится на гиперссылке в элементе, который не является выбранным в родительском элементе ItemsControl.
Имя | Ценность |
---|---|
Размах | Майор |
Версия | 4.8 |
Тип | Среда выполнения |
Затронутые API
Невозможно обнаружить с помощью анализа API.
Повышение производительности в дереве автоматизации для группировки ItemsControls
Подробности
Улучшена производительность перестроения дерева автоматизации ItemsControl, например ListBox или DataGrid, в которой включена группировка.
Имя | Ценность |
---|---|
Размах | Майор |
Версия | 4.8 |
Тип | Время выполнения |
Затронутые API
Невозможно обнаружить с помощью анализа API.
.NET Framework 4.8.1
Проблемы совместимости приложений не появились в .NET Framework 4.8.1.