有关迁移到 .NET Framework 4.8.x 的操作的重定向目标更改

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

.NET Framework 4.8

核心

托管加密类不会在 FIPS 模式下引发 CryptographyException

详细信息

在 .NET framework 4.7.2 及更低版本中,当在 FIPS 模式下配置系统加密库时,SHA256Managed 等托管加密提供程序类会引发 CryptographicException。 引发这些异常的原因是托管版本未经过 FIPS(联邦信息处理标准)140-2 认证,以及没有阻止根据 FIPS 规则规定未被认可的加密算法。 由于很少有开发人员将其开发计算机置于 FIPS 模式下,因此这些异常通常仅在生产系统上引发。面向 .NET Framework 4.8 及更高版本的应用程序会自动切换到新的且宽松的策略,以便在这种情况下默认不再引发 CryptographicException。 相反,托管加密类会将加密操作重定向到系统加密库。 此系统更改可有效地删除开发人员环境和生产环境之间可能令人混淆的差异,并使本机组件和托管组件采用相同的加密策略运行。

建议

如果不希望出现这种情况,可以选择退出该行为并还原上述行为,方法是将以下 AppContextSwitchOverrides 配置设置添加到应用程序配置文件的 <runtime> 部分中,以便在 FIPS 模式下引发 CryptographicException

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Security.Cryptography.UseLegacyFipsThrow=true" />
</runtime>

如果应用程序面向 .NET Framework 4.7.2 或更低版本,则也可以通过将以下 AppContextSwitchOverrides 配置设置添加到应用程序配置文件的 <runtime> 部分来选择加入此更改:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Security.Cryptography.UseLegacyFipsThrow=false" />
</runtime>
名称
范围 边缘
Version 4.8
类型 重定目标

受影响的 API

Windows 窗体

适用于 .NET 4.8 的 Windows 窗体控件中的辅助功能改进

详细信息

Windows 窗体框架持续改进其与辅助功能技术的协作方式,以更好地支持 Windows 窗体客户。 其中包括以下更改:

  • 改进高对比度模式的显示效果。
  • 对讲述人交互的更改。
  • 辅助功能层次结构中的更改(通过 UI 自动化树改进导航)。

建议

如何选择加入或选择退出这些更改 为使应用程序从这些更改中获益,它必须在 .NET Framework 4.8 上运行。 应用程序可通过以下任一方式选择加入这些更改:

  • 重新编译为面向 .NET Framework 4.8。 对于面向 .NET Framework 4.8 的 Windows 窗体应用程序,这些辅助功能更改将默认启用。
  • 它面向 .NET Framework 4.7.2 或更低版本,通过向应用配置文件的 <runtime> 部分添加以下 AppContext 开关并将其设置为 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.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;Switch.UseLegacyAccessibilityFeatures.3=false" />
  </runtime>
</configuration>

请注意,要选择加入 .NET Framework 4.8 中添加的辅助功能,还必须选择加入 .NET Framework 4.7.1 及 4.7.2 的辅助功能。 面向 .NET Framework 4.8 且希望保留旧版辅助功能行为的应用程序可以通过将此 AppContext 开关显式设置为 true 来选择加入使用旧版辅助功能。启用键盘 ToolTip 调用支持需要将 Switch.System.Windows.Forms.UseLegacyToolTipDisplay=false 行添加到 AppContextSwitchOverrides 值:

<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;Switch.UseLegacyAccessibilityFeatures.3=false;Switch.System.Windows.Forms.UseLegacyToolTipDisplay=false" />

请注意,启用此功能需要选择加入上述 .NET Framework 4.7.1 到 4.8 的辅助功能。 此外,如果未选择加入任何辅助功能,但选择加入了工具提示显示功能,则首次访问这些功能时将引发运行时 NotSupportedException。 异常消息表明键盘工具提示需要启用第 3 级辅助功能改进。

在高对比度主题中使用 OS 定义的颜色

  • 改进了高对比度主题。

改进了讲述人支持

改进了 CheckedListBox 辅助功能支持

  • 改进了 CheckedListBox 控件的讲述人支持。 使用键盘导航到 CheckedListBox 控件时,讲述人会聚焦 CheckedListBox 项并说出该项。
  • 控件变得聚焦时,空的 CheckedListBox 控件现包含为第一个虚拟项绘制的焦点矩形。

改进了 ComboBox 辅助功能支持

改进了 LinkLabel 辅助功能支持

  • 改进了 LinkLabel 控件辅助功能:如果禁用了对应的 LinkLabel 控件,讲述人会指示链接的禁用状态。

改进了 ProgressBar 辅助功能支持

  • ProgressBar 控件启用了 UI 自动化支持,并且可以使用 UI 自动化通知和其他 UI 自动化功能。 开发人员现可使用 UI 自动化通知,讲述人可以通过这些通知来指示进度。 有关 UI 自动化事件概述(包括 UI 自动化通知事件)的概述,请参阅 UI 自动化事件概述

改进了 PropertyGrid 辅助功能支持

  • PropertyGrid 控件启用了 UI 自动化支持,并且可以使用 UI 自动化通知和其他 UI 自动化功能。
  • 与当前编辑的属性对应的 UI 自动化元素现在是对应属性项 UI 自动化元素的子元素。
  • 如果父 PropertyGrid 控件设置为类别视图,则 UI 自动化属性项元素现在是对应类别元素的子元素。

改进了 ToolStrip 支持

  • ToolStrip 控件启用了 UI 自动化支持,并且可以使用 UI 自动化通知和其他 UI 自动化功能。
  • 改进了对 ToolStrip 项的导航。
  • 在项模式下,讲述人焦点不会消失,也不会转到隐藏项。

改进了视觉提示

  • 空的 CheckedListBox 控件现在在接收焦点时显示焦点指示器。 注意:在运行时为控件启用了 UI 自动化支持,但设计时未使用该支持。 有关 UI 自动化的概述,请参阅 UI 自动化概述

通过键盘调用控件的工具提示

  • 现可通过使用键盘聚焦控件来调用控件工具提示。 应用程序必须显式启用此功能(请参阅“如何选择加入或退出这些更改”部分)
名称
范围 主要
Version 4.8
类型 重定目标

Windows Presentation Foundation (WPF)

WPF 中辅助功能的改进

详细信息

高对比度改进

  • Expander 控件的焦点现在可见。 在先前版本的 .NET Framework 中,并非如此。
  • CheckBoxRadioButton 控件中的文本在选中时,比之前的 .NET Framework 版本更易查看。
  • 现在已禁用的 ComboBox 的边框颜色与已禁用的文本颜色相同。 在先前版本的 .NET Framework 中,并非如此。
  • 禁用和聚焦的按钮现在使用正确的主题颜色。 在先前版本的 .NET Framework 中,并未如此。
  • ComboBox 控件的样式设置为 ToolBar.ComboBoxStyleKey 时,下拉按钮现在可见。 在先前版本的 .NET Framework 中,并非如此。
  • DataGrid 控件中的排序指示器箭头现在可使用主题颜色。 在先前版本的 .NET Framework 中,并非如此。
  • 默认超链接样式更改为在鼠标悬停时显示正确的主题颜色。 在先前版本的 .NET Framework 中,并非如此。
  • 单选按钮上的键盘焦点现在可见。 在先前版本的 .NET Framework 中,并非如此。
  • 现在 DataGrid 控件的复选框列对键盘焦点反馈使用预期的颜色。 在先前版本的 .NET Framework 中,并非如此。
  • 现在,键盘焦点视觉对象在 ComboBoxListBox 控件上可见。 在先前版本的 .NET Framework 中,并非如此。

屏幕阅读器交互改进

  • 屏幕阅读器现在正确地将 Expander 控件称为组(展开/折叠)。
  • 屏幕阅读器现在正确地将 DataGridCell 控件称为数据网格单元格(已本地化)。
  • 屏幕阅读器现在将宣布可编辑的 ComboBox 的名称。
  • 屏幕阅读器不再将 PasswordBox 控件读作“视图中没有任何项”。

LiveRegion 支持

屏幕阅读器(例如讲述人)可帮助用户理解应用程序的用户界面 (UI),这通常是通过描述当前具有焦点的 UI 元素来实现的。 但是,如果 UI 元素更改了屏幕中某些地方,并且不具有焦点,则用户可能不会收到通知,并且错过重要信息。 LiveRegions 旨在解决此问题。 开发人员可使用它们来通知屏幕阅读器或任何其他 UI 自动化客户端 UI 元素有重要更改。 然后,屏幕阅读器可确定向用户通知此更改的方式和时间。 LiveSetting 属性还让屏幕阅读器知道了向用户通知 UI 更改的重要性。

建议

如何选择启用或弃用这些更改

为了使应用程序从这些更改中获益,它必须在 .NET Framework 4.7.1 或更高版本上运行。 此应用程序可通过以下任何一种方式从这些更改中获益:

  • 面向 .NET Framework 4.7.1。 此为推荐方法。 对于面向 .NET Framework 4.7.1 或更高版本的 WPF 应用程序,这些辅助功能默认启用。

  • 通过向应用配置文件的 <runtime> 部分添加以下 AppContext 开关并将其设置为 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.UseLegacyAccessibilityFeatures=false" />
      </runtime>
    </configuration>
    

如果应用程序面向 .NET Framework 4.7.1 或更高版本并希望保留旧版辅助功能行为,则它们可通过将此 AppContext 开关显式设置为 true 来选择启用旧版辅助功能。 有关 UI 自动化的概述,请参阅 UI 自动化概述

名称
范围 主要
Version 4.7.1
类型 重定目标

受影响的 API

将 SelectionTextBrush 公共属性添加到 TextBox/PasswordBox 非装饰器选择功能

详细信息

在使用 TextBoxPasswordBox基于非装饰器的文本选择功能的 WPF 应用程序中,开发人员现在可以设置新添加的 SelectionTextBrush 属性,以便更改所选文本的呈现。 默认情况下,通过 HighlightTextBrushKey 更改此颜色。 如果未启用基于非修饰器的文本选择功能,则此属性不执行任何操作。

建议

启用基于非装饰器的文本选择功能后,可以使用 PasswordBox.SelectionTextBrushSelectionTextBrush 属性更改所选文本的外观。 可以使用 XAML 实现此操作:

<TextBox SelectionBrush="Red" SelectionTextBrush="White"  SelectionOpacity="0.5"
Foreground="Blue" CaretBrush="Blue">
This is some text.
</TextBox>
“属性”
范围 主要
Version 4.8
类型 重定目标

受影响的 API

HwndHost 现可在 DPI 更改期间正确重设子 HWND 的大小

详细信息

在 .NET Framework 4.7.2 和更低版本中,WPF 在预监测感知模式下运行时(例如,将应用程序从一个监视器移动到另一个监视器时),在 DPI 发生更改后,HwndHost 中托管的控件的大小不正确。 此修复程序可确保托管控件的大小适当。

建议

为了使应用程序能够从这些更改中受益,它必须在 .NET Framework 4.7.2 或更高版本上运行,并且必须选择加入此行为,方法是将应用配置文件的 <runtime> 部分中的以下 AppContext 开关设置为 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 &#39;key1=true/false;key2=true/false  -->
<AppContextSwitchOverrides value="Switch.System.Windows.DoNotUsePresentationDpiCapabilityTier2OrGreater=false" />
</runtime>
</configuration>
“属性”
范围 主要
Version 4.8
类型 重定目标

Windows Workflow Foundation (WF)

Windows Workflow Foundation (WF) 工作流设计器中的辅助功能改进

详细信息

Windows Workflow Foundation (WF) 工作流设计器正在改进辅助功能技术的工作原理。 这些改进包括以下更改:

  • 某些控件中 Tab 键顺序更改为从左到右以及从上到下:
  • 设置 InitializeCorrelation 活动相关数据的初始化相关窗口
  • ReceiveSendSendReplyReceiveReply 活动的内容定义窗口
  • 通过键盘可以使用更多功能:
  • 编辑活动的属性时,属性组在第一次聚焦时可以通过键盘折叠。
  • 警告图标现在可以通过键盘访问。
  • “属性”窗口的“更多属性”按钮现在可以通过键盘访问。
  • 键盘用户现在可以访问工作流设计器“自变量和变量”窗格的标题项。
  • 提升了聚焦项的可见性,例如当:
  • 将行添加到工作流设计器和活动设计器使用的数据网格。
  • ReceiveReplySendReply 活动中按 Tab 键切换字段。
  • 设置变量或自变量的默认值
  • 屏幕读取器现在可以正确识别:
  • 工作流设计器中设置的断点。
  • FlowSwitch<T>FlowDecisionCorrelationScope 活动。
  • Receive 活动的内容。
  • InvokeMethod 活动的目标类型。
  • TryCatch 活动中的“异常”组合框和“最终”部分。
  • 消息传递活动(ReceiveSendSendReplyReceiveReply)中的“消息类型”组合框、“添加相关初始化表达式”窗口中的拆分器、“内容定义”窗口和“CorrelatesOn 定义”窗口。
  • 状态机转换和转换目标。
  • FlowDecision 活动上的注释和连接器。
  • 活动的上下文(右键单击)菜单。
  • 属性值编辑器、“清除搜索”按钮、“按类别”和“按字母顺序”排序按钮以及属性网格中的“表达式编辑器”对话框。
  • 工作流设计器中的缩放百分比。
  • ParallelPick 活动中的分隔符。
  • InvokeDelegate 活动。
  • 字典活动(Microsoft.Activities.AddToDictionary<TKey,TValue>Microsoft.Activities.RemoveFromDictionary<TKey,TValue> 等)的“选择类型”窗口。
  • “浏览和选择 .NET 类型”窗口。
  • 工作流设计器中的痕迹导航。
  • 选择高对比度主题的用户将看到工作流设计器及其控件可见性的许多改进,例如元素间更好的对比度和焦点元素更明显的选择框。

建议

如果你的应用程序有重新承载的工作流设计器,那么该应用程序可以通过执行其中任一操作从这些更改中受益:

  • 重新编译应用程序以面向 .NET Framework 4.7.1。 这些辅助功能更改在默认情况下启用。
  • 如果应用程序面向 .NET Framework 4.7 或更早版本,但在 .NET Framework 4.7.1 上运行,则可以通过将以下 AppContext switch 添加到 app.config 文件的 <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.UseLegacyAccessibilityFeatures=false" />
  </runtime>
</configuration>

面向 .NET Framework 4.7.1 或更高版本并希望保留旧版辅助功能行为的应用程序,可通过将此 AppContext 开关显式设置为 true 来选择启用旧版辅助功能。

“属性”
范围 次要
Version 4.7.1
类型 重定目标

符号的工作流 XAML 校验和从 SHA1 更改为 SHA256

详细信息

为支持使用 Visual Studio 进行调试,工作流运行时使用哈希算法生成工作流 XAML 文件的校验和。 在 .NET Framework 4.6.2 和早期版本中,工作流校验和哈希使用 MD5 算法,这会在启用 FIPS 的系统上导致问题。 从 .NET Framework 4.7 开始,默认算法已更改为 SHA1。 从 .NET Framework 4.8 开始,默认算法已更改为 SHA256。

建议

如果由于校验和失败,代码无法加载工作流实例或找不到相应符号,请尝试将 AppContext 开关“Switch.System.Activities.UseSHA1HashForDebuggerSymbols”设置为 true。 在代码中:

System.AppContext.SetSwitch("Switch.System.Activities.UseSHA1HashForDebuggerSymbols", true);

或在配置中:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Activities.UseSHA1HashForDebuggerSymbols=true" />
  </runtime>
</configuration>
“属性”
范围 次要
Version 4.8
类型 重定目标

工作流 XOML 定义和 SqlTrackingService 缓存密钥已从 MD5 更改为 SHA256

详细信息

工作流运行时保存 XOML 中定义的工作流定义的缓存。 SqlTrackingService 还保留按字符串键入的缓存。 由包含校验和哈希值的值键入这些缓存。 在 .NET Framework 4.7.2 和早期版本中,该校验和哈希使用 MD5 算法,这会在启用 FIPS 的系统上导致问题。 从 .NET Framework 4.8 开始,使用的算法为 SHA256。由于每次工作流运行时和 SqlTrackingService 启动时都会重新计算值,因此进行此更改后不会出现兼容性问题。 但是,我们提供了可以让客户恢复使用旧版哈希算法的例外做法(如有必要)。

建议

如果此更改在执行工作流时出现问题,请尝试设置一个或两个 AppContext 开关:

  • 将“Switch.System.Workflow.Runtime.UseLegacyHashForWorkflowDefinitionDispenserCacheKey”设为 true。
  • 将“Switch.System.Workflow.Runtime.UseLegacyHashForSqlTrackingCacheKey”设为 true。 在代码中:
System.AppContext.SetSwitch("Switch.System.Workflow.Runtime.UseLegacyHashForWorkflowDefinitionDispenserCacheKey", true);
System.AppContext.SetSwitch("Switch.System.Workflow.Runtime.UseLegacyHashForSqlTrackingCacheKey", true);

或者在配置文件中(这需要在创建 WorkflowRuntime 对象的应用程序的配置文件中):

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Workflow.Runtime.UseLegacyHashForWorkflowDefinitionDispenserCacheKey=true" />
<AppContextSwitchOverrides value="Switch.System.Workflow.Runtime.UseLegacyHashForSqlTrackingCacheKeytrue" />
</runtime>
</configuration>
“属性”
范围 次要
Version 4.8
类型 重定目标

工作流 XOML 文件校验和已从 MD5 更改为 SHA256

详细信息

为了支持使用 Visual Studio 调试基于 XOML 的工作流,当生成包含 XOML 文件的工作流项目时,系统会将 XOML 文件内容的校验和作为 WorkflowMarkupSourceAttribute.MD5Digest 值包含在生成的代码中。 在 .NET Framework 4.7.2 和早期版本中,该校验和哈希使用 MD5 算法,这会在启用 FIPS 的系统上导致问题。 从 .NET Framework 4.8 开始,采用的算法为 SHA256。 为了与 WorkflowMarkupSourceAttribute.MD5Digest 兼容,只使用生成的校验和的前 16 个字节。这可能会导致调试过程中出现问题。 可能需要重新生成项目。

建议

如果重新生成项目没有解决问题,请尝试在代码中将 AppContext 开关 Switch.System.Workflow.ComponentModel.UseLegacyHashForXomlFileChecksum 设置为 true:

System.AppContext.SetSwitch("Switch.System.Workflow.ComponentModel.UseLegacyHashForXomlFileChecksum", true);

或者在配置文件中设置(需要位于正在使用的 MSBuild.exe 的 MSBuild.exe.config 中):

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Workflow.ComponentModel.UseLegacyHashForXomlFileChecksum=true" />
</runtime>
</configuration>
“属性”
范围 次要
Version 4.8
类型 重定目标

.NET Framework 4.8.1

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