针对迁移到 .NET Framework 4.8.x 的运行时更改

本文列出了 NET Framework 4.84.8.1 中引入的应用兼容性问题。

.NET Framework 4.8

ASP.NET

ASP.NET 修复了处理 WebForms CheckBox 控件的 InputAttributes 和 LabelAttributes 的问题

详细信息

对于面向 .NET Framework 4.7.2 及更低版本的应用程序,以编程方式添加到 WebForms CheckBox 控件的 CheckBox.InputAttributesCheckBox.LabelAttributes 将在回发后丢失。 对于面向 .NET Framework 4.8 或更高版本的应用程序,它们会在回发后保留。

建议

要在回发时还原属性的正确行为,请将 targetFrameworkVersion 设置为 4.8 或更高版本。 例如:

<configuration>
<system.web>
<httpRuntime targetFramework="4.8"/>
</system.web>
</configuration>

将其设置为更低版本或根本不设置会保留旧的错误行为。

“属性”
范围 未知
Version 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>
名称
范围 未知
Version 4.8
类型 运行时

受影响的 API

使用自定义 DataAnnotations.ValidationAttribute 时,ASP.NET ValidationContext.MemberName 不为 NULL

详细信息

在 .NET Framework 4.7.2 及更低版本中,使用自定义 System.ComponentModel.DataAnnotations.ValidationAttribute 时,ValidationContext.MemberName 属性返回 null。 在 2019 年 10 月更新之前的 .NET Framework 4.8 版本中,它返回成员名称。 从 .NET Framework 4.8 的 .NET Framework 2019 年 10 月质量汇总预览开始,它默认将返回 null,但是可以选择改为返回成员名称。

建议

将以下设置添加到属性的 web.config 文件中,以返回 .NET Framework 4.8 和更高版本的 .NET Framework 2019 年 10 月质量汇总预览中的成员名称:

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

在 2019 年 10 月更新之前的 .NET Framework 4.8 版本中,将此内容添加到 web.config 文件会还原以前的行为,并且该属性会返回 null

名称
范围 未知
Version 4.8
类型 运行时

受影响的 API

核心

.NET COM 成功封送事件上的 ByRef SafeArray 参数

详细信息

在 .NET Framework 4.7.2 及更低版本中,COM 事件上的 ByRef SafeArray 参数无法封送回本机代码。 进行此更改后,SafeArray 现在可成功进行封送。

  • [x] Quirked

建议

如果正确封送 COM 事件上的 ByRef SafeArray 参数会中断执行,则可以通过将以下配置开关添加到应用程序配置来禁用此代码:

<appSettings>
  <add key="Switch.System.Runtime.InteropServices.DoNotMarshalOutByrefSafeArrayOnInvoke" value="true" />
</appSettings>
“属性”
范围 次要
Version 4.8
类型 运行时

受影响的 API

无法通过 API 分析检测到。

.NET Interop 现将为 IAgileObject 的 QueryInterface(WinRT 接口)

详细信息

自 .NET Framework 4.8 起,使用带有 .NET 委托的 WinRT 事件时,Windows 将为 IAgileObject 进行 QI。 在以前版本的 .NET Framework 中,运行时进行该 QI 将失败,并且无法订阅事件。

  • [x] Quirked

建议

如果为 IAgileObject 启用 QI 会中断执行,则可以通过设置以下配置来禁用此代码。

方法 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 /? 查看有关此语法的帮助内容。 注册表值名称不区分大小写。

“属性”
范围 边缘
Version 4.8
类型 运行时

受影响的 API

无法通过 API 分析检测到。

Windows Communication Foundation (WCF)

svcTraceViewer ComboBox 对比度更改

详细信息

Microsoft Service Trace Viewer 工具中,在某些高对比度主题中,ComboBox 控件未以正确的颜色显示。 此问题已在 .NET Framework 4.7.2 中解决。 但是,由于 .NET Framework SDK 后向兼容性要求,因此默认情况下客户无法看到该修复程序。 .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" />
“属性”
范围 边缘
Version 4.8
类型 运行时

受影响的 API

无法通过 API 分析检测到。

Windows Presentation Foundation (WPF)

KeyedCollection 的数据绑定改进

详细信息

修复了源对象使用相同签名(例如 KeyedCollection<int,TItem>)声明自定义索引器时 Binding 错误使用 IList 索引器的问题。

建议

为了使针对较旧版本的应用程序能够从此更改中受益,它必须在 .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>
“属性”
范围 主要
Version 4.8
类型 运行时

受影响的 API

无法通过 API 分析检测到。

解决了当 ListBox 包含重复值类型时停止响应的问题

详细信息

修复了以下问题:当虚拟化 ItemsControlItems 集合包含重复值类型化对象时,可能会在滚动期间停止响应。

名称
范围 主要
Version 4.8
类型 运行时

受影响的 API

无法通过 API 分析检测到。

网格星型行空格分配算法的改进

详细信息

修复了在 .NET Framework 4.7 中引入的 Grid用于分配大小的算法的问题。 在某些情况下,例如,Height=&quot;Auto&quot; 包含空行的网格,行排列在错误的位置,可能完全在网格之外。

建议

为使应用程序从这些更改中获益,它必须在 .NET Framework 4.8 或更高版本上运行。

“属性”
范围 主要
Version 4.8
类型 运行时

受影响的 API

无法通过 API 分析检测到。

详细信息

修复了当焦点位于项(该项不是父 ItemsControl 的选定项)内的超链接上时,按箭头键出现错误结果的问题。

“属性”
范围 主要
Version 4.8
类型 运行时

受影响的 API

无法通过 API 分析检测到。

自动化树中对 ItemsControls 进行分组的性能改进

详细信息

改进了重新生成 ItemsControl(例如,ListBox 或 DataGrid)的自动化树的性能,其中启用了分组功能。

“属性”
范围 主要
Version 4.8
类型 运行时

受影响的 API

无法通过 API 分析检测到。

.NET Framework 4.8.1

.NET Framework 4.8.1 中未引入任何应用兼容性问题。