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

本文列出了 .NET Framework 4.74.7.1中引入的应用兼容性问题,以及 4.7.2

.NET Framework 4.7

ASP.NET

HttpRuntime.AppDomainAppPath 抛出 NullReferenceException

详情

在 .NET Framework 4.6.2 中,在检索包含 null 字符的 T:System.NullReferenceException 值时,运行时将引发 P:System.Web.HttpRuntime.AppDomainAppPath。在 .NET Framework 4.6.1 及更早版本中,运行时将引发 T:System.ArgumentNullException

建议

可以执行以下任一操作来响应此更改:

  • 如果应用程序是在 .NET Framework 4.6.2 上运行,请处理 T:System.NullReferenceException
  • 升级到 .NET Framework 4.7,这会还原以前的行为并引发 T:System.ArgumentNullException
名字
范围 Microsoft Edge
版本 4.6.2
类型 重定目标

受影响的 API

每个会话的限制并发请求数

详情

在 .NET Framework 4.6.2 及更早版本中,ASP.NET 按顺序执行具有相同 Sessionid 的请求,ASP.NET 默认情况下始终通过 Cookie 发出 Sessionid。 如果页面需要很长时间才能做出响应,则只需在浏览器中按 F5 ,它就会显著降低服务器性能。 在修补程序中,我们添加了一个计数器来跟踪排队的请求,并在请求超出指定限制时终止请求。 默认值为 50。 如果达到此限制,则会在事件日志中记录警告,并且可能会在 IIS 日志中记录 HTTP 500 响应。

建议

若要还原旧行为,可以将以下设置添加到 web.config 文件,以选择退出新行为。

<appSettings>
    <add key="aspnet:RequestQueueLimitPerSession" value="2147483647"/>
</appSettings>
名字
范围 Microsoft Edge
版本 4.7
类型 重定目标

联网

ServicePointManager.SecurityProtocol 的默认值为 SecurityProtocolType.System.Default

详情

从面向 .NET Framework 4.7 的应用程序开始,ServicePointManager.SecurityProtocol 属性的默认值为 SecurityProtocolType.SystemDefault。 此更改允许基于 SslStream(如 FTP、HTTPS 和 SMTP)的 .NET Framework 网络 API 从操作系统继承默认安全协议,而不是使用 .NET Framework 定义的硬编码值。 默认值因操作系统和系统管理员执行的任何自定义配置而异。 有关 Windows 操作系统的每个版本中的默认 SChannel 协议的信息,请参阅 TLS/SSL 中的 协议(Schannel SSP)

对于面向早期版本的 .NET Framework 的应用程序,ServicePointManager.SecurityProtocol 属性的默认值取决于目标 .NET Framework 的版本。 请参阅“针对 .NET Framework 4.5.2 到 4.6 迁移的重定目标更改”中的“网络”部分,了解详细信息。

建议

此更改会影响面向 .NET Framework 4.7 或更高版本的应用程序。 如果希望使用定义的协议,而不是依赖于系统默认值,则可以显式设置 ServicePointManager.SecurityProtocol 属性的值。 如果此更改不可取,可以通过将配置设置添加到应用程序配置文件 <运行时> 部分来选择退出该更改。 以下示例显示 <runtime> 部分和 Switch.System.Net.DontEnableSystemDefaultTlsVersions 选择弃用开关:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=true" />
</runtime>
名字
范围 次要
版本 4.7
类型 重定目标

受影响的 API

SslStream 支持 TLS 警报

详情

TLS 握手失败后,第一个 I/O 读取/写入操作将引发带有内部 System.IO.IOException 异常的 System.ComponentModel.Win32Exception。 可以使用 System.ComponentModel.Win32Exception.NativeErrorCodeSystem.ComponentModel.Win32Exception 代码从远程参与方映射到 TLS 警报。有关详细信息,请参阅 RFC 2246:第 7.2.2 节错误警报
在 .NET Framework 4.6.2 及更早版本中,如果另一方在握手失败后立即拒绝连接,则传输通道(通常是 TCP 连接)会在写入或读取期间超时。

建议

调用网络 I/O API(如 Read(Byte[], Int32, Int32)/Write(Byte[], Int32, Int32))的应用程序应处理 IOExceptionSystem.TimeoutException
从 .NET Framework 4.7 开始,TLS 警报功能默认处于启用状态。 面向 .NET Framework 4.0 到 4.6.2 版本(在 .NET Framework 4.7 或更高版本上运行)的应用程序将禁用该功能以保持兼容性。
以下配置 API 可用于启用或禁用在 .NET Framework 4.7 或更高版本上运行的 .NET Framework 4.6 及更高版本的应用程序的功能。

  • 以编程方式:应用程序必须做的第一件事,因为 ServicePointManager 只会初始化一次:

    AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true);
    
    // Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2.
    AppContext.SetSwitch("Switch.System.Net.DontEnableTlsAlerts", true);
    
  • AppConfig:

    <runtime>
      <AppContextSwitchOverrides value="Switch.System.Net.DontEnableTlsAlerts=true"/>
      <!-- Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. -->
    </runtime>
    
  • 注册表项(计算机全局):将值设置为 false 以在 .NET Framework 4.6 - 4.6.2 中启用该功能。

    Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts
    - Type: String
    - Value: "true"
    
名字
范围 Microsoft Edge
版本 4.7
类型 重定目标

受影响的 API

安全

CspParameters.ParentWindowHandle 现在需要 HWND 值

详情

.NET Framework 2.0 中引入的 ParentWindowHandle 值允许应用程序注册一个父窗口句柄值,确保访问密钥时需要的任何用户界面(如 PIN 提示框或同意对话框)可以作为指定窗口的模式子窗口打开。从面向 .NET Framework 4.7 的应用开始,Windows 窗体应用程序可以使用如下代码设置 ParentWindowHandle 属性:

cspParameters.ParentWindowHandle = form.Handle;

在早期版本的 .NET Framework 中,该值应为 System.IntPtr,表示 HWND 值驻留在内存中的位置。 将属性设置为 form.Handle 在 Windows 7 和较早版本中没有效果,但在 Windows 8 及更高版本中,会导致“System.Security.Cryptography.CryptographicException:参数不正确”。

建议

如果应用程序要注册父窗口关系且面向 .NET Framework 4.7 或更高版本,建议使用简易窗体:

cspParameters.ParentWindowHandle = form.Handle;

如果用户已确定要传递的正确值是保留 form.Handle 值的内存位置地址,可通过将 AppContext 开关 Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle 设置为 true 来选择弃用此行为更改:

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

相反,当应用程序在旧版 .NET Framework 版本下加载时,希望在 .NET Framework 4.7 运行时选择加入新行为的用户可以将 AppContext 开关设置为 false

名字
范围 次要
版本 4.7
类型 重定目标

受影响的 API

SslStream 支持 TLS 警报

详情

TLS 握手失败后,第一个 I/O 读取/写入操作将引发带有内部 System.IO.IOException 异常的 System.ComponentModel.Win32Exception。 可以使用 System.ComponentModel.Win32Exception.NativeErrorCodeSystem.ComponentModel.Win32Exception 代码从远程参与方映射到 TLS 警报。有关详细信息,请参阅 RFC 2246:第 7.2.2 节错误警报
在 .NET Framework 4.6.2 及更早版本中,如果另一方在握手失败后立即拒绝连接,则传输通道(通常是 TCP 连接)会在写入或读取期间超时。

建议

调用网络 I/O API(如 Read(Byte[], Int32, Int32)/Write(Byte[], Int32, Int32))的应用程序应处理 IOExceptionSystem.TimeoutException
从 .NET Framework 4.7 开始,TLS 警报功能默认处于启用状态。 面向 .NET Framework 4.0 到 4.6.2 版本(在 .NET Framework 4.7 或更高版本上运行)的应用程序将禁用该功能以保持兼容性。
以下配置 API 可用于启用或禁用在 .NET Framework 4.7 或更高版本上运行的 .NET Framework 4.6 及更高版本的应用程序的功能。

  • 以编程方式:应用程序必须做的第一件事,因为 ServicePointManager 只会初始化一次:

    AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true);
    
    // Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2.
    AppContext.SetSwitch("Switch.System.Net.DontEnableTlsAlerts", true);
    
  • AppConfig:

    <runtime>
      <AppContextSwitchOverrides value="Switch.System.Net.DontEnableTlsAlerts=true"/>
      <!-- Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. -->
    </runtime>
    
  • 注册表项(计算机全局):将值设置为 false 以在 .NET Framework 4.6 - 4.6.2 中启用该功能。

    Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts
    - Type: String
    - Value: "true"
    
名字
范围 Microsoft Edge
版本 4.7
类型 重定目标

受影响的 API

Windows Communication Foundation (WCF)

使用 DataContractJsonSerializer 控制字符的序列化现在与 ECMAScript V6 和 V8 兼容

详情

在 .NET Framework 4.6.2 及更早版本中,System.Runtime.Serialization.Json.DataContractJsonSerializer 未以与 ECMAScript V6 和 V8 标准兼容的方式序列化某些特殊控制字符,如 \b、\f 和 \t。 从 .NET Framework 4.7 开始,这些控制字符的序列化与 ECMAScript V6 和 V8 兼容。

建议

对于面向 .NET Framework 4.7 的应用,默认情况下会启用此功能。 如果不需要此行为,可以通过将以下行添加到 app.config 或 web.config 文件的 <runtime> 部分来选择退出此功能:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Runtime.Serialization.DoNotUseECMAScriptV6EscapeControlCharacter=false" />
</runtime>
名字
范围 Microsoft Edge
版本 4.7
类型 重定目标

受影响的 API

WCF 消息安全性现在能够使用 TLS1.1 和 TLS1.2

详情

从 .NET Framework 4.7 开始,客户除了通过应用程序配置设置配置 SSL3.0 和 TLS1.0 外,还可以在 WCF 消息安全性中配置 TLS1.1 或 TLS1.2。

建议

在 .NET Framework 4.7 中,默认情况下禁用对 WCF 消息安全性中的 TLS1.1 和 TLS1.2 的支持。 可以通过将以下行添加到 app.config 或 web.config 文件的 <runtime> 部分来启用它:

<runtime>
<AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols=false;Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
</runtime>
名字
范围 Microsoft Edge
版本 4.7
类型 重定目标

Windows Presentation Foundation (WPF)

在启用触摸功能的系统上,调用 System.Windows.Input.PenContext.Disable 可能会引发 ArgumentException。

详情

在某些情况下,在启用触摸的系统上调用内部 System.Windows.Intput.PenContext.Disable 方法可能会因为重新进入而引发未处理的 T:System.ArgumentException

建议

.NET Framework 4.7 中已解决此问题。 若要避免此异常,升级到 .NET Framework 4.7 及以上版本。

名字
范围 Microsoft Edge
版本 4.6.1
类型 重定目标

ImageSourceConverter.ConvertFrom 异常处理代码中的 NullReferenceException

详情

ConvertFrom(ITypeDescriptorContext, CultureInfo, Object) 的异常处理代码中的错误导致引发不正确的 System.NullReferenceException 而不是预期的异常(System.IO.DirectoryNotFoundExceptionSystem.IO.FileNotFoundException)。 此更改修正了该错误,使得该方法现在抛出正确的异常。

默认情况下,所有面向 .NET Framework 4.6.2 和更低版本的应用程序都将继续引发 System.NullReferenceException 以确保兼容性。 面向 .NET Framework 4.7 和更高版本的开发人员应该能看到正确的异常。

建议

想要还原为在面向 .NET Framework 4.7 或更高版本时获取 System.NullReferenceException 的开发人员可将以下内容添加/合并到应用程序的 App.config 文件:

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Media.ImageSourceConverter.OverrideExceptionWithNullReferenceException=true"/>
</runtime>
</configuration>
名字
范围 Microsoft Edge
版本 4.7
类型 重定目标

受影响的 API

WPF 网格向 -列分配空间

详情

从 .NET Framework 4.7 开始,WPF 将替换 Grid 用于向 *列分配空间的算法。 这在以下许多情况下会更改分配给 *-列的实际宽度:

  • 当一个或多个 *-列的最小或最大宽度替代相应列的按比例分配空间时。 (最小宽度可以派生自 MinWidth 显式声明,也可以派生自从列内容中获取的隐式最小值。只能通过 MaxWidth 声明显式定义最大宽度。)
  • 当一个或多个 *-列声明极大 *-权重时(即大于 10^298)。
  • 当 *-权重明显不同,遇到了浮点不稳定问题(溢出、下溢、精度损失)时。
  • 当布局圆化处理已启用且有效显示 DPI 足够高时。 在前两种情况下,新算法生成的宽度可能与旧算法生成的宽度大相径庭:在最后一种情况下,差异最多为一个或两个像素。

新算法修复了旧算法中存在的多个 bug:

  • 对列的总分配可能超过网格的宽度。 在为某列分配空间时,如果该列的比例分配小于其最小大小,则可能会发生这种情况。 该算法分配最小大小,这会减少其他列可用的空间。 如果没有可分配空间的 *-列剩余,分配的总空间可能会过大。

  • 总分配可能达不到网格的宽度。 这是第 1 个问题的对偶问题,当向比例份额大于其大小上限的列分配空间,没有剩余的 *-列来收紧空间时,可能会出现这种问题。

  • 可能会向两个 *-列分配与其 *-权重不成比例的空间。 这是第 1 个/第 2 个问题造成的较为温和的影响,当依序向 *-列 A、B 和 C 分配空间,但 B 列的比例份额与约束下限(或上限)冲突时,可能会出现这种问题。 同样,这会更改 C 列的可用空间,它将比 A 列获得更少(或更多)的按比例分配空间。

  • 权重极大 (> 10^298) 的列全都被视为具有权重 10^298。 这些列(以及权重略小的列)之间的比例差异将不会生效。

  • 无法正确处理具有无限权重的列。 (实际上,你不能将权重设置为无穷大,但这是一个人为的限制。分配代码尝试处理它,但执行了一项错误的工作。

  • 在避免溢出、下溢、精度损失和类似浮点问题时,存在一些小问题。

  • 在 DPI 足够高的情况下,无法正确调整布局的圆化处理。 新算法生成满足以下条件的结果:

    • 分配给 *-column 的实际宽度永远不会小于其最小宽度,也不小于其最大宽度。
    • 对于没有分配最小或最大宽度的每个 *-列,向其分配与其 *-权重成比例的宽度。 确切地说,如果两列分别使用宽度 x* 和 y* 进行声明,并且两列都未收到其最小或最大宽度,则分配给列的实际宽度 v 和 w 的比例相同:v/ w == x / y。
    • 分配给“成比例的”*-列的总宽度等于分配给受约束列(向其分配了最小或最大宽度的固定、自动和 *-列)后剩余的可用空间。 例如,如果最小宽度的总和超过网格的可用宽度,则此值可能为零。
    • 对所有这些陈述的解释都应参照“理想”布局。 当布局舍入生效时,实际宽度可以与理想的宽度相差多达一个像素。

注意

本文中有关列和宽度的所有说明同样也适用于行和高度。

建议

默认情况下,以 .NET Framework 4.7 开头的 .NET Framework 版本的应用将看到新的算法,而面向 .NET Framework 4.6.2 或更早版本的应用将看到旧算法。

若要替代默认值,请使用以下配置设置:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>

true 选择旧算法,false 选择新算法。

名字
范围 次要
版本 4.7
类型 重定目标

基于 WPF 指针的触控堆栈

详情

此次更改后,可启用基于可选 WM_POINTER 的 WPF 触控/触笔堆栈。 未显式启用此功能的开发人员在 WPF 触摸 / 触笔行为中不会看到任何变化。基于可选 WM_POINTER 的触摸 / 触笔堆栈的当前已知问题:

  • 不支持实时墨迹书写。
  • 虽然书写和触笔插件仍然可以正常工作,但它们将在 UI 线程上处理,这可能会导致性能不佳。
  • 从触控/触笔事件提升到鼠标事件方面的更改导致行为发生变化
  • 控制行为可能不同
  • 拖放操作无法为触摸输入提供适当的反馈
  • 这不会影响触笔输入
  • 无法再通过触控/触笔事件启动拖/放行为
  • 这可能会导致应用程序在检测到鼠标输入之前停止响应。
  • 相反,开发者应通过鼠标事件启动拖放行为。

建议

希望启用此堆栈的开发人员可以将以下内容添加到其应用程序的 App.config 文件中:

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.EnablePointerSupport=true"/>
</runtime>
</configuration>

删除此项或将值设置为 false 将禁用此可选堆栈。请注意,此堆栈仅适用于 Windows 10 创作者更新及更高版本。

名字
范围 Microsoft Edge
版本 4.7
类型 重定目标

Windows Workflow Foundation (WF)

工作流校验和已从 MD5 更改为 SHA1

详情

为了支持使用 Visual Studio 进行调试,工作流运行时使用哈希算法为工作流实例生成校验和。 在 .NET Framework 4.6.2 及更早版本中,工作流校验和哈希使用 MD5 算法,这导致了启用 FIPS 的系统的问题。 从 .NET Framework 4.7 开始,算法为 SHA1。 如果代码保留了这些校验和,它们将是不兼容的。

建议

如果代码由于校验和失败而无法加载工作流实例,请尝试将 AppContext 开关“Switch.System.Activities.UseMD5ForWFDebugger”设置为 true。在代码中:

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

或在配置中:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Activities.UseMD5ForWFDebugger=true" />
  </runtime>
</configuration>
名字
范围 次要
版本 4.7
类型 重定目标

.NET Framework 4.7.1

ASP.NET

.NET Framework 4.7.1 中的 ASP.NET 无障碍功能改进

详情

从 .NET Framework 4.7.1 开始,ASP.NET 改进了 ASP.NET Web 控件在 Visual Studio 中使用辅助功能技术的方式,以更好地支持 ASP.NET 客户。 其中包括以下更改:

  • 在以下控件中实现缺失 UI 的辅助功能模式:例如“详细信息视图”向导中的“添加字段”对话框或“ListView”向导的“配置 ListView”对话框。
  • 改善在高对比度模式下(如数据页导航字段编辑器)的显示。
  • 更改以改进控件的键盘导航体验,例如 DataPager 控件的“编辑分页器字段”向导中的“字段”对话框、“配置对象上下文”对话框或“配置数据源”向导的“配置数据选择”对话框。

建议

如何选择加入或退出这些更改 为了使 Visual Studio Designer 受益于这些更改,它必须在 .NET Framework 4.7.1 或更高版本上运行。 Web 应用程序可通过以下任一方式受益于这些更改:

  • 安装 Visual Studio 2017 15.3 或更高版本,它在默认情况下使用以下 AppContext 开关支持新的辅助功能。
  • 如以下示例所示,通过将 Switch.UseLegacyAccessibilityFeatures AppContext 开关添加到 devenv.exe.config 文件中的 <runtime> 部分并将其设置为 false,可选择弃用旧版辅助功能行为。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<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 来选择启用旧版辅助功能。

名字
范围 次要
版本 4.7.1
类型 重定目标

核心

SerialPort 后台线程异常

详情

使用 SerialPort 流创建的后台线程在引发 OS 异常时不再终止进程。
在面向 .NET Framework 4.7 和更早版本的应用程序中,当使用 SerialPort 流创建的后台线程上引发操作系统异常时,进程将终止。
在面向 .NET Framework 4.7.1 或更高版本的应用程序中,后台线程会等待与活动串行端口相关的 OS 事件,在某些情况下可能会崩溃,例如突然删除串行端口。

建议

对于定位于 .NET Framework 4.7.1 的应用程序,如果不需要异常处理,可以通过在您的 <runtime> 文件的 app.config 部分添加以下内容来选择禁用此功能。

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=true" />
</runtime>

对于面向旧版 .NET Framework,但在 .NET Framework 4.7.1 或更高版本上运行的应用,可通过将以下内容添加到 <runtime> 文件的 app.config 部分来选择使用异常处理:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=false" />
</runtime>
名字
范围 次要
版本 4.7.1
类型 重定目标

受影响的 API

ServiceBase 不会传播 OnStart 异常

详情

在 .NET Framework 4.7 及更早版本中,服务启动时引发的异常不会传播到 ServiceBase.Run的调用方。

从面向.NET Framework 4.7.1 的应用程序开始,针对启动失败的服务,运行时会将异常传播到 ServiceBase.Run

建议

在服务启动时,如果有异常,则会传播该异常。 这有助于诊断服务无法启动的情况。

如果此行为不可取,可以通过将以下 AppContextSwitchOverrides 元素添加到应用程序配置文件的 runtime 部分来选择退出该行为:

<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=true" />

如果您的应用程序目标版本低于 4.7.1,但您希望实现这种行为,请将以下 AppContextSwitchOverrides 元素添加到应用程序配置文件的 runtime 节:

<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=false" />
名字
范围 次要
版本 4.7.1
类型 重定目标

受影响的 API

安全

默认的 SignedXML 和 SignedXMS 算法更改为 SHA256

详情

在 .NET Framework 4.7 及更早版本中,对于某些操作,SignedXML 和 SignedCMS 默认为 SHA1。从 .NET Framework 4.7.1 开始,默认情况下会为这些操作启用 SHA256。 此更改是必需的,因为不再将 SHA1 视为安全。

建议

默认使用两个新的上下文切换值来控制 SHA1(不安全)还是 SHA256:

  • Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms
  • Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms 对于面向 .NET Framework 4.7.1 及更高版本的应用程序(如果不希望使用 SHA256),可以通过将以下配置开关添加到应用配置文件的 运行时 部分,将默认设置还原到 SHA1:
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=true;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=true" />

对于面向 .NET Framework 4.7 及更低版本的应用程序,可以通过将以下配置开关添加到应用配置文件的 运行时 部分来选择加入此更改:

<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=false;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=false" />
名字
范围 次要
版本 4.7.1
类型 重定目标

受影响的 API

SignedXml.GetPublicKey 在 net462(或 lightup)上返回 RSACng 而不重定向更改

详情

从 .NET Framework 4.6.2 开始,SignedXml.GetPublicKey 方法返回的对象的具体类型在不做特殊调整的情况下,从 CryptoServiceProvider 实现更改为 Cng 实现。 这是因为实现已从使用 certificate.PublicKey.Key 更改为使用内部 certificate.GetAnyPublicKey(将转到 RSACertificateExtensions.GetRSAPublicKey)。

建议

从 .NET Framework 4.7.1 版本开始运行的应用程序,可以通过在应用程序配置文件的 运行时 部分添加以下配置开关,来使用 .NET Framework 4.6.1 及更早版本中默认的 CryptoServiceProvider 实现:

<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.SignedXmlUseLegacyCertificatePrivateKey=true" />
名字
范围 Microsoft Edge
版本 4.6.2
类型 重定目标

受影响的 API

Windows Communication Foundation (WCF)

改进了某些 .NET SDK 工具的无障碍功能

详情

在 .NET Framework SDK 4.7.1 中,通过修复各种可访问性问题改进了 SvcConfigEditor.exe 和 SvcTraceViewer.exe 工具。 其中大多数是小问题,例如未定义名称或某些 UI 自动化模式未正确实现。 虽然许多用户不会意识到这些不正确的值,但使用辅助技术(如屏幕阅读器)的客户会发现这些 SDK 工具更易于访问。 当然,这些修复程序改变了以前的某些行为,如键盘焦点顺序。为获取这些工具中的所有辅助功能修复程序,可对 app.config 文件执行以下操作:

<runtime>
  <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false"/>
</runtime>
名字
范围 Microsoft Edge
版本 4.7.1
类型 重定目标

Windows 窗体

Windows 窗体控件中的辅助功能改进

详情

Windows 窗体正在改进其与辅助功能技术的协作方式,以更好地支持使用 Windows 窗体的用户。 其中包括从 .NET Framework 4.7.1 开始的以下更改:

  • 更改以提高高对比度模式期间的显示效果。
  • 提升属性浏览器体验。 属性浏览器改进包括:
  • 更好地通过各种下拉选择窗口使用键盘导航。
  • 减少不必要的制表位。
  • 更好地报告控件类型。
  • 改进了讲述人行为。
  • 在控件中实现缺少 UI 辅助功能模式。

建议

如何选择加入或退出这些更改 为了使应用程序受益于这些更改,它必须在 .NET Framework 4.7.1 或更高版本上运行。 应用程序可以通过以下任一方式受益于这些更改:

  • 它被重新编译,为了适应 .NET Framework 4.7.1。 默认情况下,这些无障碍功能更改在面向 .NET Framework 4.7.1 或更高版本的 Windows 窗体应用程序中启用。
  • 通过向 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 来选择启用旧版辅助功能。

有关 UI 自动化的概述,请参阅 UI 自动化概述

添加了对 UI 自动化模式和属性 的支持

辅助功能客户端可通过使用常用的公开描述调用模式来利用新的 WinForms 辅助功能。 这些模式不是特定于 WinForms 的。 例如,辅助功能客户端可以在 IAccessible 接口(MAAS)上调用 QueryInterface 方法以获取 IServiceProvider 接口。 如果此接口可用,客户端可以使用其 QueryService 方法请求 IAccessibleEx 接口。 有关详细信息,请参阅从客户端使用 IAccessibleEx。 从 .NET Framework 4.7.1 开始,IServiceProvider 和 IAccessibleEx(如果适用)可用于 WinForms 辅助功能对象。

.NET Framework 4.7.1 添加了对以下 UI 自动化模式和属性的支持:

在高对比度主题中使用由操作系统定义的颜色

  • ButtonCheckBox 控件的 FlatStyle 属性设置为 FlatStyle.System(默认样式),现在,在高对比度主题中选中这两个控件时,它们会使用 OS 定义的颜色。 以前,文本和背景色没有对比,难以阅读。
  • ButtonCheckBoxRadioButtonLabelLinkLabelGroupBox 控件及其设置为“false”的 Enabled 属性在高对比度主题中使用阴影颜色呈现文本,从而降低与背景的对比度。 现在,这些控件使用 OS 定义的“禁用文本”颜色。 此修补程序适用于 FlatStyle 属性设置为除 FlatStyle.System以外的值的控件。 后一个控件由 OS 呈现。
  • DataGridView 现在围绕具有当前焦点的单元内容呈现可见的矩形。 以前,在某些高对比度主题中这是不可见的。
  • ToolStripMenuItem 属性设置为 Enabled 控件现在使用 OS 定义的“无效文本”颜色。
  • ToolStripMenuItem 属性设置为 Checked 控件现以系统颜色的对比色呈现相关复选标记。 以前,复选标记颜色的对比度不足,在高对比度主题中不可见。 注意:Windows 10 已更改某些高对比度系统颜色的值。 Windows 窗体框架基于 Win32 框架。 为了获得最佳体验,请在最新版本的 Windows 上运行,并通过在测试应用程序中添加 app.manifest 文件并取消注释以下代码来选择加入最新的 OS 更改:
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

改进的键盘导航

  • ComboBox 控件的 DropDownStyle 属性设置为 ComboBoxStyle.DropDownList 并且是窗体上的选项卡顺序中的第一个控件时,它现在使用键盘打开父窗体时显示焦点矩形。 在此更改之前,键盘焦点位于此控件上,但未呈现焦点指示器。

改进了讲述人支持

  • MonthCalendar 控件对访问控件添加了辅助技术支持,包括使讲述人朗读控件值的功能(以前无法读取)。

  • CheckedListBox 属性发生更改时,CheckBox.CheckState 控件现在会通知讲述人。 以前,讲述人未收到通知,因此不会通知用户 CheckState 属性已更新。

  • LinkLabel 控件更改了通知讲述人控件文本的方式。 此前,讲述人宣布此文本两次,并读取“&”符号作为真实文本,即使用户看不到它们。 现已从讲述人朗读中删除重复的文本以及不必要的“&”符号。

  • DataGridViewCell 控件类型现在正确地向讲述人和其他辅助技术报告只读状态。

  • 讲述人现在可在 [多文档界面]~/docs/framework/winforms/advanced/multiple-document-interface-mdi-applications.md) 应用程序中读取子窗口的系统菜单。

  • 讲述人现在能朗读将 ToolStripMenuItem 属性设置为 ToolStripItem.Enabled 控件。 以前,讲述人无法将焦点置于已禁用的菜单项来朗读内容。

名字
范围 主要
版本 4.8
类型 重定目标

受影响的 API

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>并将其设置为 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 自动化概述

名字
范围 主要
版本 4.7.1
类型 重定目标

受影响的 API

选择器 SelectionChanged 事件和 SelectedValue 属性

详情

从 .NET Framework 4.7.1 开始,当选择发生变化时,Selector 在引发 SelectedValue 事件之前总是先更新它的 SelectionChanged 属性的值。 这使得 SelectedValue 属性与其他选择属性(SelectedItemSelectedIndex)保持一致,这些属性在引发事件之前会更新。

在 .NET Framework 4.7 及更早版本中,大多数情况下,SelectedValue 的更新发生在事件之前,但如果选择更改是由更改 SelectedValue 属性引起的,则会在事件发生后发生。

建议

面向 .NET Framework 4.7.1 或更高版本的应用可以选择退出此更改并使用旧行为,方法是将以下内容添加到应用程序配置文件的 <runtime> 部分:

<runtime>
<AppContextSwitchOverrides
value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=true" />
</runtime>

对于面向 .NET Framework 4.7 或更早版本,但在 .NET Framework 4.7.1 或更高版本上运行的应用,可以在应用程序配置文件的 <runtime> 部分中添加以下代码行,从而启用新的行为:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=false" />
</runtime>
名字
范围 次要
版本 4.7.1
类型 重定目标

受影响的 API

TabControl SelectionChanged 事件和 SelectedContent 属性

详情

从 .NET Framework 4.7.1 开始,当选择更改时,TabControl 会在引发 SelectedContent 事件之前更新其 SelectionChanged 属性的值。在 .NET Framework 4.7 及更早版本中,对 SelectedContent 的更新是在事件之后进行的。

建议

面向 .NET Framework 4.7.1 或更高版本的应用可以选择退出此更改并使用旧行为,方法是将以下内容添加到应用程序配置文件的 <runtime> 部分:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=true" />
</runtime>

对于面向 .NET Framework 4.7 或更早版本,但在 .NET Framework 4.7.1 或更高版本上运行的应用,可以在应用程序配置文件的 <runtime> 部分中添加以下代码行,从而启用新的行为:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=false" />
</runtime>
名字
范围 次要
版本 4.7.1
类型 重定目标

受影响的 API

WPF PackageDigitalSignatureManager 的默认哈希算法现在是 SHA256

详情

System.IO.Packaging.PackageDigitalSignatureManager 提供与 WPF 包相关的数字签名功能。 在 .NET Framework 4.7 及更早版本中,用于对包部分进行签名的默认算法(PackageDigitalSignatureManager.DefaultHashAlgorithm)是 SHA1。 由于最近对 SHA1 的安全问题,从 .NET Framework 4.7.1 开始,此默认值已更改为 SHA256。 此更改会影响所有包签名,包括 XPS 文档。

建议

面向低于 .NET Framework 4.7.1 的框架版本而希望利用此更改的开发人员,或在面向 .NET Framework 4.7.1 或更高版本时需要先前功能的开发人员,可以适当地设置以下 AppContext 标志。 当值为 true 时,将使用 SHA1 作为默认算法;当值为 false 时,将使用 SHA256。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.UseSha1AsDefaultHashAlgorithmForDigitalSignatures=true"/>
</runtime>
</configuration>
名字
范围 Microsoft Edge
版本 4.7.1
类型 重定目标

受影响的 API

Windows Workflow Foundation (WF)

Windows Workflow Foundation (WF) 工作流设计器中的无障碍功能改进

详情

Windows Workflow Foundation (WF) 工作流设计器正在改进它与辅助功能技术配合使用的方式。 这些改进包括以下更改:

  • 选项卡顺序在一些控件中更改为从左到右和从上到下:
  • 设置 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 来选择启用旧版辅助功能。

名字
范围 次要
版本 4.7.1
类型 重定目标

.NET Framework 4.7.2

核心

允许在 URI 中使用 Unicode 双向控制字符

详情

Unicode 指定用于指定文本方向的多个特殊控制字符。 在早期版本的 .NET Framework 中,即使这些字符以百分比编码的形式存在,它们也被错误地从所有 URI 中剥离。 为了更好地遵循 RFC 3987 ,我们现在允许 URI 中的这些字符。 如果在 URI 中出现未编码的字符,则对其进行百分比编码。 如果出现百分比编码的字符,则原样保留。

建议

对于以 .NET Framework 4.7.2 及更高版本为目标的应用程序,默认启用对 Unicode 双向字符的支持。 如果不需要此更改,可通过将以下 AppContextSwitchOverrides 开关添加到应用程序配置文件的 <runtime> 部分,从而禁用更改:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters=true" />
</runtime>

对于面向较早版本 .NET Framework 的应用程序,但在 .NET Framework 4.7.2 及更高版本下运行的应用程序,默认情况下禁用了对 Unicode 双向字符的支持。 可通过将以下 AppContextSwitchOverrides 开关添加到应用程序配置文件的 <runtime> 部分,进行启用:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters=false" />
</runtime>
名字
范围 次要
版本 4.7.2
类型 重定目标

受影响的 API

DeflateStream 使用本机 API 进行解压缩

详情

从 .NET Framework 4.7.2 开始,T:System.IO.Compression.DeflateStream 类中的解压缩实现已更改为默认使用本机 Windows API。 通常,这会导致大幅提高性能。 面向 .NET Framework 版本 4.7.2 或更高版本的所有 .NET 应用程序都使用本机实现。此更改可能会导致行为存在一些差异,其中包括:

  • 异常消息可能有所不同。 但是,引发的异常类型保持不变。
  • 某些特殊情况(例如没有足够的内存来完成操作)可能以不同的方式进行处理。
  • 分析 gzip 标头存在一些已知差异(注意:仅影响用于解压缩的 GZipStream 集):
  • 分析无效标头时出现异常可能在不同的时间引发。
  • 本机实现强制根据规范设置 gzip 标头(即 FLG)内的一些保留标记值,这可能导致其在忽略先前无效值的情况下引发异常。

建议

如果使用原生 API 的解压缩对您的应用程序行为造成不利影响,您可以通过将 Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression 开关添加到 app.config 文件的 runtime 部分,并将其设置为 true,来选择退出此功能:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression=true" />
  </runtime>
</configuration>
名字
范围 次要
版本 4.7.2
类型 重定目标

受影响的 API

确保 System.Uri 使用一致的保留字符集

详情

System.Uri 中,某些有时会被解码的百分比编码字符现在始终保持编码状态。 这发生在访问 URI 的路径、查询、片段或 userinfo 组件的属性和方法中。 仅当以下两项均为 true 时,该行为才会发生更改:

  • URI 包含以下任一保留字符的编码形式::'()!*
  • URI 包含 Unicode 或编码的非保留字符。 如果以上两项均为 true,则编码的保留字符保持编码状态。 在早期版本的 .NET Framework 中,它们被解码。

建议

对于面向 .NET Framework 4.7.2 及更高版本的应用程序,默认启用新的解码行为。 如果不需要此更改,可通过将以下 AppContextSwitchOverrides 开关添加到应用程序配置文件的 <runtime> 部分,从而禁用更改:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=true" />
</runtime>

对于面向 .NET Framework 早期版本,但在 .NET Framework 4.7.2 及更高版本下运行的应用程序,默认禁用新的解码行为。 可通过将以下 AppContextSwitchOverrides 开关添加到应用程序配置文件的 <runtime> 部分,进行启用:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=false" />
</runtime>
名字
范围 次要
版本 4.7.2
类型 重定目标

受影响的 API

Resgen 拒绝从 Web 加载内容

详情

.resx 文件可能包含二进制格式输入。 如果尝试使用 resgen 加载从不受信任的位置下载的文件,则默认情况下将无法加载输入。

建议

需要从不受信任的位置加载二进制格式输入的 resgen 用户可以从输入文件中删除 Web 标记,也可以应用选择退出。添加以下注册表设置,以应用计算机范围的选择退出:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\SDK] "AllowProcessOfUntrustedResourceFiles"="true"

名字
范围 Microsoft Edge
版本 4.7.2
类型 重定目标

使用便携式 PDB 时获取的堆栈跟踪现在包括源文件和行信息(如果请求)

详情

从 .NET Framework 4.7.2 开始,使用可移植 PDB 时获取的堆栈跟踪包括源文件和请求时行信息。 在 .NET Framework 4.7.2 之前的版本中,即使已显式请求,使用便携式 PDB 时也不会提供源文件和行信息。

建议

对于面向 .NET Framework 4.7.2 的应用程序, 当使用可移植 PDB 时, 如果不希望包含源文件和行信息, 您可以通过在 <runtime> 文件的 app.config 部分添加以下内容来选择退出这些信息:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=true" />
</runtime>

对于面向旧版 .NET Framework,但在 .NET Framework 4.7.2 或更高版本上运行的应用程序,可通过将以下内容添加到 <runtime> 文件的 app.config 部分,从而选择启用在使用便携式 PDB 时获取源文件和行信息:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=false" />
</runtime>
名字
范围 Microsoft Edge
版本 4.7.2
类型 重定目标

受影响的 API

Windows 窗体

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

详情

Windows 窗体框架正在改进它与辅助功能技术配合使用的方式,以更好地支持 Windows 窗体客户。 其中包括以下更改:

  • 更改以提高高对比度模式期间的显示效果。
  • 更改以改进 DataGridView 和 MenuStrip 控件中的键盘导航。
  • 对讲述人交互的更改。

建议

如何选择加入或退出这些更改 为了使应用程序受益于这些更改,它必须在 .NET Framework 4.7.2 或更高版本上运行。 应用程序可以通过以下任一方式受益于这些更改:

  • 重新编译为面向 .NET Framework 4.7.2。 对于面向 .NET Framework 4.7.2 或更高版本的 Windows 窗体 应用程序,这些辅助功能更改将默认启用。
  • 它面向 .NET Framework 4.7.1 或更早版本,通过向 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;Switch.UseLegacyAccessibilityFeatures.2=false" />
  </runtime>
</configuration>

请注意,若要选择加入 .NET Framework 4.7.2 中添加的辅助功能,还必须选择加入 .NET Framework 4.7.1 的辅助功能。 面向 .NET Framework 4.7.2 或更高版本并希望保留旧版辅助功能行为的应用程序,可通过将此 AppContext 开关显式设置为 true 来选择启用旧版辅助功能。

在高对比度主题中使用由操作系统定义的颜色

  • 在高对比度主题中,ToolStripDropDownButton 的下拉箭头现在使用操作系统定义的颜色。
  • 现在,在高对比度主题中选中将 ButtonRadioButtonCheckBox 控件的 FlatStyle 设置为 FlatStyle.FlatFlatStyle.Popup 时,它们会使用 OS 定义的颜色。 以前,文本和背景色没有对比,难以阅读。
  • 包含在 GroupBox(其 Enabled 属性设置为 false)中的控件现在将在高对比度主题中使用 OS 定义的颜色。
  • 在高对比度模式下,ToolStripButtonToolStripComboBoxToolStripDropDownButton 控件的亮度对比度增加。
  • 默认情况下,DataGridViewLinkCell 在高对比度模式下会使用 OS 定义的颜色应用于 DataGridViewLinkCell.LinkColor 属性。 注意:Windows 10 已更改某些高对比度系统颜色的值。 Windows 窗体框架基于 Win32 框架。 为了获得最佳体验,请在最新版本的 Windows 上运行,并通过在测试应用程序中添加 app.manifest 文件并取消注释以下代码来选择加入最新的 OS 更改:
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

改进了讲述人支持

改进了 DataGridView 辅助功能支持

改进了视觉指示

改进了属性网格支持

名字
范围 主要
版本 4.7.2
类型 重定目标

存在嵌套 ToolStripMenuItems 时,ContextMenuStrip.SourceControl 属性包含有效控件

详情

在 .NET Framework 4.7.1 及以前的版本中,当用户从嵌套 ContextMenuStrip.SourceControl 控件打开菜单时,ToolStripMenuItem 属性错误地返回 null。 在 .NET Framework 4.7.2 及更高版本中,SourceControl 属性始终设置为实际的源代码管理。

建议

如何选择加入或退出这些更改 为了使应用程序受益于这些更改,它必须在 .NET Framework 4.7.2 或更高版本上运行。 应用程序可以通过以下任一方式受益于这些更改:

  • 它面向 .NET Framework 4.7.2。 默认情况下,此更改在面向 .NET Framework 4.7.2 或更高版本的 Windows 窗体应用程序中启用。
  • 它面向 .NET Framework 4.7.1 或更早版本,通过向 app.config 文件的 部分添加以下 <runtime>并将其设置为 false,可选择弃用旧版辅助功能行为,如下例所示。
<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue=false"/>
</runtime>

面向 .NET Framework 4.7.2 或更高版本且希望保留旧版行为的应用可以通过将此 AppContext 开关显式设置为 true来选择使用旧版源代码管理值。

名字
范围 Microsoft Edge
版本 4.7.2
类型 重定目标

受影响的 API

PrivateFontCollection.AddFontFile 方法释放字体资源

详情

在 .NET Framework 4.7.1 及之前的版本中,对于使用 System.Drawing.Text.PrivateFontCollection 方法添加到此集合的 PrivateFontCollection 对象,Font 类在 AddFontFile(String) 被处理后不会释放 GDI+ 字体资源。 在 .NET Framework 4.7.2 和更高版本中,Dispose 会释放作为文件添加到此集合的 GDI+ 字体。

建议

如何选择加入或退出这些更改 为了使应用程序受益于这些更改,它必须在 .NET Framework 4.7.2 或更高版本上运行。 应用程序可以通过以下任一方式受益于这些更改:

  • 重新编译为面向 .NET Framework 4.7.2。 默认情况下,此更改在面向 .NET Framework 4.7.2 或更高版本的 Windows 窗体应用程序中启用。
  • 它面向 .NET Framework 4.7.1 或更早版本,通过向 app.config 文件的 部分添加以下 <runtime>并将其设置为 false,可选择弃用旧版辅助功能行为,如下例所示。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Drawing.Text.DoNotRemoveGdiFontsResourcesFromFontCollection=false"/>
</runtime>

面向 .NET Framework 4.7.2 或更高版本并希望保留旧版行为的应用程序,可通过将此 AppContext 开关显式设置为 true 来选择不释放字体资源。

名字
范围 Microsoft Edge
版本 4.7.2
类型 重定目标

受影响的 API

WinForm 的域上按钮和向下按钮操作现已同步

详情

在 .NET Framework 4.7.1 及早期版本中,当存在控件文本时,将忽略 DomainUpDown 控件的 DomainUpDown.UpButton() 操作,并且开发人员在使用 DomainUpDown.DownButton() 操作之前,需要在控件上使用 DomainUpDown.UpButton() 操作。 从 .NET Framework 4.7.2 开始,DomainUpDown.UpButton()DomainUpDown.DownButton() 操作在此方案中独立工作,并且保持同步。

建议

为了使应用程序受益于这些更改,它必须在 .NET Framework 4.7.2 或更高版本上运行。 应用程序可以通过以下任一方式受益于这些更改:

  • 重新编译为面向 .NET Framework 4.7.2。 默认情况下,此更改在面向 .NET Framework 4.7.2 或更高版本的 Windows 窗体应用程序中启用。
  • 它选择退出旧滚动行为,方法是将以下 AppContext Switch 添加到应用配置文件的 <runtime> 部分,并将其设置为 false,如以下示例所示。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling=false"/>
</runtime>
名字
范围 Microsoft Edge
版本 4.7.2
类型 重定目标

受影响的 API

Windows Presentation Foundation (WPF)

现在,键盘焦点可在 WinForms/WPF 承载的多个层之间正确移动

详情

请考虑托管 WinForms 控件的 WPF 应用程序,后者又承载 WPF 控件。 如果该层中的第一个或最后一个控件是 WPF System.Windows.Forms.Integration.ElementHost,则用户可能无法退出 WinForms 层。 此更改修复了此问题,现在用户可以通过 Tab 键离开 WinForms 层。依赖于焦点始终停留在 WinForms 层的自动化应用程序可能无法再按预期工作。

建议

想要在目标框架版本低于 .NET 4.7.2 时利用此更改的开发人员可以将以下一组 AppContext 标志设置为 false,从而启用更改。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false"/>
</runtime>
</configuration>

WPF 应用程序必须选择启用所有早期的可访问性改进,才能使用之后的改进。 换言之,必须同时设置 Switch.UseLegacyAccessibilityFeaturesSwitch.UseLegacyAccessibilityFeatures.2 开关。如果开发人员需要以前的功能,且面向 .NET 4.7.2 或更高版本,他可将以下 AppContext 标记设置为 false,从而禁用更改。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true"/>
</runtime>
</configuration>
名字
范围 Microsoft Edge
版本 4.7.2
类型 重定目标

WPF 标记编译器的默认哈希算法现在是 SHA256

详情

WPF MarkupCompiler 为 XAML 标记文件提供编译服务。 在 .NET Framework 4.7.1 及更早版本中,用于校验和的默认哈希算法为 SHA1。 由于最近对 SHA1 的安全问题,从 .NET Framework 4.7.2 开始,此默认值已更改为 SHA256。 此更改会影响编译期间标记文件的所有校验和生成。

建议

以 .NET Framework 4.7.2 或更高版本为目标且想要还原为 SHA1 哈希行为的开发人员必须设置以下 AppContext 标志。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Markup.DoNotUseSha256ForMarkupCompilerChecksumAlgorithm=true"/>
</runtime>
</configuration>

想要在针对低于 .NET 4.7.2 的框架版本时使用 SHA256 哈希的开发人员必须设置以下 AppContext 标识。 请注意,已安装的 .NET Framework 版本必须为 4.7.2 或更高版本。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Markup.DoNotUseSha256ForMarkupCompilerChecksumAlgorithm=false"/>
</runtime>
</configuration>
名字
范围 透明
版本 4.7.2
类型 重定目标

WPF AppDomain 关闭处理现在可以调用 Dispatcher.Invoke 以清理弱事件

详情

在 .NET Framework 4.7.1 及更早的版本中,在 AppDomain 关闭期间,WPF 可能会在 .NET 终结器线程上创建 System.Windows.Threading.Dispatcher。 此问题已在 .NET Framework 4.7.2 和更高版本中得到修复,方法是使弱事件的清理能够感知线程。 因此,WPF 可能会调用 Dispatcher.Invoke 来完成清理过程。在某些应用程序中,终结器计时的此更改可能会导致 AppDomain 或进程关闭期间出现异常。 这种情况常见于未在进程或 AppDomain 关闭之前正确关闭在工作线程上运行的调度程序的应用程序中。 此类应用程序应注意正确管理调度器的生存期。

建议

在 .NET Framework 4.7.2 及更高版本中,开发人员可以禁用此修补程序,以帮助缓解(但不消除)由于清理更改而导致的计时问题。若要禁用清理中的更改,请使用以下 AppContext 标志。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotInvokeInWeakEventTableShutdownListener=true"/>
</runtime>
</configuration>
名字
范围 Microsoft Edge
版本 4.7.2
类型 重定目标

WPF 在主/从方案中显示 ADO 数据时更改主键

详情

假设你有一个类型为 Order的项的 ADO 集合,有一个名为“OrderDetails”的关系,通过主键“OrderID”将其与一个类型为 Detail 的项集合关联。 在 WPF 应用中,可以将列表控件绑定到给定订单的详细信息:

<ListBox ItemsSource="{Binding Path=OrderDetails}" >

其中 DataContext 是 "Order" 。 WPF 会获取 OrderDetails 属性的值 - 其 Detail 与主项的 OrderID 匹配的所有 OrderID 项的集合 D。 更改主项的主密钥 OrderID 时,会出现行为更改。 ADO 自动更改详细信息集合中每个受影响记录的 OrderID(即复制到集合 D 的信息)。 那 D 呢?

  • 旧行为:清除集合 D。 主项不会发出属性 OrderDetails 的更改通知。 ListBox 继续使用集合 D,该集合现在为空。
  • 新行为:集合 D 保持不变。 其中每一项都将发出 OrderID 属性的更改通知。 ListBox 继续使用集合 D,并使用新的 OrderID显示详细信息。 WPF 通过以不同的方式创建集合 D 来实现新行为:调用 ADO 方法 DataRowView.CreateChildView(DataRelation, Boolean),并将 followParent 参数设置为 true

建议

应用通过使用以下 AppContext 开关获取新行为。

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Data.DoNotUseFollowParentWhenBindingToADODataRelation=false"/>
  </runtime>
</configuration>

对于面向 .NET 4.7.1 或更低版本的应用,开关默认为 true(旧行为),而对于面向 .NET 4.7.2 或更高版本的应用,开关默认为 false(新行为)。

名字
范围 次要
版本 4.7.2
类型 重定目标

RadioButton 和 CheckBox 的 WPF FocusVisual 现可在控件无内容时正确显示

详情

在 .NET Framework 4.7.1 及更早版本中,WPF System.Windows.Controls.CheckBoxSystem.Windows.Controls.RadioButton 不一致,在经典和高对比度主题中,焦点视觉对象不正确。 如果控件没有任何内容集,则会出现这些问题。 这会使主题之间的切换变得令人困惑和焦点视觉对象难以看到。 在 .NET Framework 4.7.2 中,这些视觉对象现在在主题中更加一致,在经典和高对比度主题中更易于查看。

建议

如果一个面向 .NET Framework 4.7.2 的开发人员希望恢复到 .NET 4.7.1 的行为模式,他们需要设置以下 AppContext 标志。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true;"/>
</runtime>
</configuration>

希望利用此更改的开发人员在目标框架版本低于 .NET 4.7.2 时,必须设置以下 AppContext 标志。请注意,必须适当地设置所有标志,并且 .NET Framework 的已安装版本必须为 4.7.2 或更高版本。WPF 应用程序需要选择加入所有先前的辅助功能改进,以获得最新的改进。 若要执行此操作,请确保将“Switch.UseLegacyAccessibilityFeatures”和“Switch.UseLegacyAccessibilityFeatures.2”这两个 AppContext 开关设置为 false。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;"/>
</runtime>
</configuration>
名字
范围 Microsoft Edge
版本 4.7.2
类型 重定目标

WPF TextBox/PasswordBox 文本选择不遵循系统颜色

详情

在 .NET Framework 4.7.1 及更早版本中,WPF System.Windows.Controls.TextBoxSystem.Windows.Controls.PasswordBox 只能在装饰器层中呈现文本选择。 在某些系统主题中,这将遮挡文本,使其难以阅读。 在 .NET Framework 4.7.2 及更高版本中,开发人员可以选择启用一种非基于装饰器的选择呈现方案,以缓解此问题。

建议

想要利用此更改的开发人员必须相应地设置以下 AppContext 标志。 若要利用此功能,已安装的 .NET Framework 必须是 4.7.2 或更高版本。若要启用基于非装饰器的选择,请使用以下 AppContext 标记。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering=false"/>
</runtime>
</configuration>
名字
范围 Microsoft Edge
版本 4.7.2
类型 重定目标

Windows Workflow Foundation (WF)

避免 IWorkflowInstanceManagement.TransactedCancel 和 IWorkflowInstanceManagement.TransactedTerminate 无限递归

详情

在某些情况下,当使用 IWorkflowInstanceManagement.TransactedCancelIWorkflowInstanceManagement.TransactedTerminate API 取消或终止工作流服务实例时,当 Workflow 运行时尝试在处理请求过程中保留服务实例时,工作流实例可能会遇到堆栈溢出。 如果工作流实例处于等待另一项服务的其他未完成 WCF 请求完成的状态,则会出现此问题。 TransactedCancelTransactedTerminate 操作会创建排队等待工作流服务实例的工作项。 这些工作项不会作为处理 TransactedCancel/TransactedTerminate 请求的一部分执行。 由于工作流服务实例正忙于等待其他未完成的 WCF 请求完成,因此创建的工作项将保持排队状态。 TransactedCancel/TransactedTerminate 操作完成后,控制权将返回给客户端。 当与 TransactedCancel/TransactedTerminate 操作关联的事务尝试提交时,它需要保留工作流服务实例状态。 但由于实例有未完成 WCF 请求,工作流运行时无法持久保存工作流服务实例,并且无限的递归循环会导致堆栈溢出。由于 TransactedCancelTransactedTerminate 仅在内存中创建工作项,因此事务存在的事实没有任何影响。 事务回滚不会放弃工作项。为了解决此问题,自 .NET Framework 4.7.2 起,我们引入了 AppSetting,可将其添加到工作流服务的 web.config/app.config,使其忽略 TransactedCancelTransactedTerminate 的事务。 这样,不必等待工作流实例保留即可提交事务。 此功能的 AppSetting 名为 microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminatetrue 值指示应忽略事务,从而避免堆栈溢出。 此 AppSetting 的默认值为 false,因此现有工作流服务实例不会受到影响。

建议

如果在尝试取消或终止工作流实例时使用的是 AppFabric 或其他 IWorkflowInstanceManagement 客户端,并且尝试取消或终止工作流实例时遇到工作流服务实例中的堆栈溢出,则可以将以下内容添加到工作流服务的 web.config/app.config 文件的 <appSettings> 部分:

<add key="microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate" value="true"/>

如果未遇到该问题,则无需执行此操作。

名字
范围 Microsoft Edge
版本 4.7.2
类型 重定目标