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

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

.NET Framework 4.8

ASP.NET

ASP.NET. Исправление обработки InputAttributes и LabelAttributes для элемента управления "Флажок" в веб-формах

Сведения

Для приложений, предназначенных для .NET Framework 4.7.2 и более ранних версий, CheckBox.InputAttributes и CheckBox.LabelAttributes, добавленные в элемент управления 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 до обновления October 2019 возвращает имя элемента. Начиная с версии .NET Framework October 2019 Preview of Quality Rollup для .NET Framework 4.8 возвращает null по умолчанию, но при этом сохраняется возможность вернуть имя элемента.

Предложение

Добавьте следующий параметр в файл web.config для свойства, чтобы вернуть имя элемента в .NET Framework October 2019 Preview of Quality Rollup для .NET Framework 4.8 и более поздних версий:

<configuration>
<appSettings>
...
<add key="aspnet:GetValidationMemberName"  value="true"/>
...
</appSettings>
</configuration>

В версии .NET Framework 4.8 до обновления October 2019, добавление этого параметра в файл web.config восстанавливает предыдущее поведение, а свойство возвращает null.

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

Затронутые API

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

.NET COM успешно маршалирует параметры ByRef SafeArray в события

Сведения

В .NET Framework 4.7.2 и более ранних версиях параметр ByRef SafeArray события COM не позволял выполнить маршалинг обратно в машинный код. Благодаря этому изменению SafeArray теперь успешно маршалируется.

  • [x] Режим совместимости

Предложение

Если правильный маршалинг параметров ByRef SafeArray в событиях COM нарушает выполнение, этот код можно отключить, добавив следующий параметр конфигурации в файл конфигурации приложения:

<appSettings>
  <add key="Switch.System.Runtime.InteropServices.DoNotMarshalOutByrefSafeArrayOnInvoke" value="true" />
</appSettings>
Имя. Значение
Область Незначительный
Версия 4,8
Тип Параметры выполнения

Затронутые API

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

Взаимодействие .NET теперь будет использовать QueryInterface для IAgileObject (интерфейс WinRT)

Сведения

При использовании события WinRT с делегатом .NET Windows будет использовать QI для IAgileObject начиная с .NET Framework 4.8. В предыдущих версиях .NET Framework среда выполнения некорректно обрабатывала QI и на событие невозможно было подписаться.

  • [x] Режим совместимости

Предложение

Если включение 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 /?. Имя значения реестра обрабатывается без учета регистра.

Имя. Значение
Область Microsoft Edge
Версия 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" />
Имя. Значение
Область Microsoft 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=&quot;Auto&quot;, которая содержит пустые строки, строки были расположены в неправильном положении, возможно, даже за пределами сетки.

Предложение

Чтобы эти изменения можно было использовать в приложении, оно должно быть запущено на платформе .NET Framework 4.8 или более поздней версии.

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

Затронутые API

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

Сведения

Исправлен неправильный результат нажатия клавиши со стрелкой, когда фокус установлен на гиперссылку в элементе, который не является выбранным элементом родительского ItemsControl.

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

Затронутые API

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

Улучшение производительности в дереве автоматизации для группирования элементов ItemsControls

Сведения

Повышена производительность при перестроении дерева автоматизации ItemsControl, например ListBox и DataGrid, в котором включено группирование.

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

Затронутые API

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

платформа .NET Framework 4.8.1

Проблемы совместимости приложений не появились в платформа .NET Framework 4.8.1.