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

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

.NET Framework 4.7

ASP.NET

HttpRuntime.AppDomainAppPath 引发 NullReferenceException

详细信息

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

建议

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

  • 如果应用程序是在 .NET Framework 4.6.2 上运行,请处理 T:System.NullReferenceException
  • 升级到 .NET Framework 4.7,这将还原以前的行为并引发 T:System.ArgumentNullException
“属性”
范围 边缘
Version 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>
“属性”
范围 边缘
Version 4.7
类型 重定目标

网络

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

详细信息

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

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

建议

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

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=true" />
</runtime>
“属性”
范围 次要
Version 4.7
类型 重定目标

受影响的 API

SslStream 支持 TLS 警报

详细信息

TLS 握手失败后,第一个 I/O 读取/写入操作将引发带有内部 System.ComponentModel.Win32Exception 异常的 System.IO.IOException。 可以使用 TLS 和 SSL 警报的 Schannel 错误代码System.ComponentModel.Win32ExceptionSystem.ComponentModel.Win32Exception.NativeErrorCode 代码从远程参与方映射到 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.7 或更高系统上运行的面向 .NET Framework 4.0 到 4.6.2 版本的应用程序将禁用该功能以保留兼容性。
以下配置 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"
    
名称
范围 边缘
Version 4.7
类型 重定目标

受影响的 API

安全性

CspParameters.ParentWindowHandle 现在需要 HWND 值

详细信息

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

cspParameters.ParentWindowHandle = form.Handle;

在先前版本的 .NET Framework 中,该值应为 System.IntPtr,表示内存中驻留 HWND 值的位置。 在 Windows 7 和更低版本上,将属性设置为 form.Handle 不会造成任何影响,但在 Windows 8 和更高版本中,此操作会导致“System.Security.Cryptography.CryptographicException:参数不正确。”

建议

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

cspParameters.ParentWindowHandle = form.Handle;

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

  • 以编程方式在 AppContext 上设置兼容性开关,如此处所述。
  • 在 app.config 文件的 <runtime> 部分中添加下面的代码行:
<runtime>
 <AppContextSwitchOverrides value="Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle=true"/>
</runtime>

相反,如果用户希望在旧版 .NET Framework 中加载应用程序时选择启用 .NET Framework 4.7 运行时上的新行为,则可将 AppContext 开关设置为 false

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

受影响的 API

SslStream 支持 TLS 警报

详细信息

TLS 握手失败后,第一个 I/O 读取/写入操作将引发带有内部 System.ComponentModel.Win32Exception 异常的 System.IO.IOException。 可以使用 TLS 和 SSL 警报的 Schannel 错误代码System.ComponentModel.Win32ExceptionSystem.ComponentModel.Win32Exception.NativeErrorCode 代码从远程参与方映射到 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.7 或更高系统上运行的面向 .NET Framework 4.0 到 4.6.2 版本的应用程序将禁用该功能以保留兼容性。
以下配置 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"
    
名称
范围 边缘
Version 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>
“属性”
范围 边缘
Version 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>
“属性”
范围 边缘
Version 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 及以上版本。

“属性”
范围 边缘
Version 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>
“属性”
范围 边缘
Version 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 足够高的情况下,无法正确调整布局的圆化处理。 新算法生成符合以下条件的结果:

    • 分配给 *-列的实际宽度永远不会小于其最小宽度,也不会大于其最大宽度。
    • 对于没有分配最小或最大宽度的每个 *-列,向其分配与其 *-权重成比例的宽度。 确切地讲,如果分别使用宽度 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 表示选择新算法。

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

基于 WPF 指针的触控堆栈

详细信息

此次更改后,可启用基于可选 WM_POINTER 的 WPF 触控/触笔堆栈。 没有显式启动此功能的开发人员应该看不到 WPF 触控/触笔行为的更改。基于 WPF 触控/触笔堆栈的可选 WM_POINTER 当前存在的已知问题:

  • 不支持实时墨迹书写。
  • 尽管墨迹书写和触笔插件仍可运行,但它们是在 UI 线程上进行处理,这可能会导致性能变得糟糕。
  • 从触控/触笔事件提升到鼠标事件方面的更改导致行为发生变化
  • 控制行为可能不同
  • 拖/放行为无法正确显示触控输入反馈
  • 这不会影响触笔输入
  • 无法再通过触控/触笔事件启动拖/放行为
  • 这可能会导致应用程序停止响应,直到检测到鼠标输入。
  • 相反,开发者应通过鼠标事件启动拖放行为。

建议

要启用此堆栈的开发者可以在应用程序的 App.config 文件中添加/合并下面的代码:

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

删除它或将该值设为 false 将关闭此可选堆栈。请注意,此堆栈仅在 Windows 10 创意者更新以及更高版本上可用。

“属性”
范围 边缘
Version 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>
“属性”
范围 次要
Version 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 控件的“编辑页导航字段”向导中的“字段”对话框、“配置 ObjectContext”对话框或“配置数据源”向导的“配置数据选择”对话框。

建议

如何选择启用或弃用这些更改 为使 Visual Studio 设计器从这些更改中获益,它必须在 .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 来选择启用旧版辅助功能。

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

核心

SerialPort 后台线程异常

详细信息

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

建议

对于面向 .NET Framework 4.7.1 的应用,如果无需异常处理,可通过将以下内容添加到 app.config 文件的 <runtime> 部分,从而选择不用异常处理:

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

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

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=false" />
</runtime>
“属性”
范围 次要
Version 4.7.1
类型 重定目标

受影响的 API

ServiceBase 不传播 OnStart 异常

详细信息

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

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

建议

服务启动时,如果出现异常,将传播该异常。 这有助于诊断服务启动失败的事例。

如果不需要此行为,可在应用程序配置文件的 runtime 部分中添加以下 AppContextSwitchOverrides 元素,从而选择弃用此行为:

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

如果应用程序面向早于 4.7.1 的版本,但你需要此行为,请将以下 AppContextSwitchOverrides 元素添加到应用程序配置文件的 runtime 部分:

<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=false" />
名称
范围 次要
Version 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" />
“属性”
范围 次要
Version 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" />
“属性”
范围 边缘
Version 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>
“属性”
范围 边缘
Version 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> 部分添加以下 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 自动化概述

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

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

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

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

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

改进了的键盘导航

  • ComboBox 控件将其 DropDownStyle 属性设置为 ComboBoxStyle.DropDownList 并且为窗体上 Tab 键顺序中的第一个控件时,在使用键盘打开父级窗体时,该控件现在将显示焦点矩形。 在此更改之前,键盘焦点在控件上,但不会呈现焦点指示器。

改进了讲述人支持

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

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

  • LinkLabel 控件更改了通知讲述人控件文本的方式。 以前,讲述人会宣读此文本两次并将“&”符号作为实际文本进行朗读,即使这些符号对用户不可见。 已从讲述人宣读中删除重复的文本以及不必要的“&”符号。

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

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

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

“属性”
范围 主要
Version 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> 部分添加以下 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

选择器 SelectionChanged 事件和 SelectedValue 属性

详细信息

自 .NET Framework 4.7.1 起,在引发 SelectionChanged 事件之前,Selector 始终在选择更改时更新其 SelectedValue 属性值。 这使得 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>
“属性”
范围 次要
Version 4.7.1
类型 重定目标

受影响的 API

TabControl SelectionChanged 事件和 SelectedContent 属性

详细信息

从 .NET Framework 4.7.1 开始,当选择发生变化时,TabControl 在引发 SelectionChanged 事件之前更新其 SelectedContent 属性的值。而在 .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>
“属性”
范围 次要
Version 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>
“属性”
范围 边缘
Version 4.7.1
类型 重定目标

受影响的 API

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
类型 重定目标

.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 的路径、查询、片段或用户信息组件的属性和方法中。 仅当以下两项均为 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"

名称
范围 边缘
Version 4.7.2
类型 重定目标

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

详细信息

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

建议

对于面向 .NET Framework 4.7.2 的应用程序,如果不需要在使用便携式 PDB 时获取的源文件和行信息,可通过将以下内容添加到 app.config 文件的 <runtime> 部分,从而选择弃用:

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

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

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=false" />
</runtime>
“属性”
范围 边缘
Version 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> 部分添加以下 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" />
  </runtime>
</configuration>

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

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

<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

改进了讲述人支持

改进了 DataGridView 辅助功能支持

改进了视觉提示

改进了属性网格支持

“属性”
范围 主要
Version 4.7.2
类型 重定目标

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

详细信息

在 .NET Framework 4.7.1 和更早版本中,用户从嵌套 ToolStripMenuItem 控件中打开菜单时,ContextMenuStrip.SourceControl 属性会错误地返回 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> 部分添加以下 AppContext 开关并将其设置为 false,可选择弃用旧版辅助功能行为,如下例所示。
<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue=false"/>
</runtime>

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

“属性”
范围 边缘
Version 4.7.2
类型 重定目标

受影响的 API

PrivateFontCollection.AddFontFile 方法释放字体资源

详细信息

在 .NET Framework 4.7.1 和早期版本中,为使用 AddFontFile(String) 方法添加到此集合的 Font 对象设置 PrivateFontCollection 后,System.Drawing.Text.PrivateFontCollection 类不会释放 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> 部分添加以下 AppContext 开关并将其设置为 false,可选择弃用旧版辅助功能行为,如下例所示。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Drawing.Text.DoNotRemoveGdiFontsResourcesFromFontCollection=false"/>
</runtime>

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

“属性”
范围 边缘
Version 4.7.2
类型 重定目标

受影响的 API

WinForm 的域 upbutton 和 downbutton 操作现已同步

详细信息

在 .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 窗体应用程序,此更改将默认启用。
  • 通过向应用配置文件的 <runtime> 部分添加以下 AppContext 开关并将其设置为 false,可选择弃用旧版滚动行为,如下例所示。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling=false"/>
</runtime>
“属性”
范围 边缘
Version 4.7.2
类型 重定目标

受影响的 API

Windows Presentation Foundation (WPF)

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

详细信息

请考虑 WPF 应用程序,其承载的 WinForms 控件会反过来承载 WPF 控件。 如果该层的第一个或最后一个控件是 WPF System.Windows.Forms.Integration.ElementHost,那么用户可能不能按 Tab 离开 WinForms 层。 此更改修复了这个问题,现在,用户能按 Tab 离开 WinForms layer.Automated 应用程序。这些应用程序依赖于绝不转义 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>
“属性”
范围 边缘
Version 4.7.2
类型 重定目标

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

详细信息

WPF 标记编译器为 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>
“属性”
范围 透明
Version 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>
“属性”
范围 边缘
Version 4.7.2
类型 重定目标

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

详细信息

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

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

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

  • 旧行为:清除集合 D。 主项不会发出属性 OrderDetails 的更改通知。 列表框将继续使用集合 D,现为空。
  • 新行为:集合 D 保持不变。 其中每一项都将发出 OrderID 属性的更改通知。 列表框将持续使用集合 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>
“属性”
范围 边缘
Version 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>
“属性”
范围 边缘
Version 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"/>

如果没有遇到问题,则不需要执行此操作。

“属性”
范围 边缘
Version 4.7.2
类型 重定目标