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

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

.NET Framework 4.7

JIT

传递和比较 UInt16 值时,代码生成不正确

详细信息

由于 .NET Framework 4.7 中引入了更改,在某些情况下,.NET Framework 4.7 上运行的应用程序中由 JIT 编译器生成的代码错误地比较了两个 T:System.UInt16 值。 有关详细信息,请参阅 GitHub.com 上的问题 #11508:传递和比较 ushort 参数时不提示错误 codegen

建议

如果在 .NET Framework 4.7 中比较 16 位无符号值时遇到问题,请升级到 .NET Framework 4.7.1。

名称
范围 边缘
Version 4.7
类型 运行时

受影响的 API

无法通过 API 分析检测到。

Windows Presentation Foundation (WPF)

从自定义 INCC 集合删除项时选择器出现故障

详细信息

T:System.InvalidOperationException 会在以下方案中发生:

  • T:System.Windows.Controls.Primitives.Selector 的 ItemsSource 是 T:System.Collections.Specialized.INotifyCollectionChanged 自定义实现的集合。
  • 从集合中删除所选的项。
  • T:System.Collections.Specialized.NotifyCollectionChangedEventArgsP:System.Collections.Specialized.NotifyCollectionChangedEventArgs.OldStartingIndex = -1(表示未知位置)。

异常的调用堆栈开始 at System.Windows.Threading.Dispatcher.VerifyAccess() at System.Windows.DependencyObject.GetValue(DependencyProperty dp) at System.Windows.Controls.Primitives.Selector.GetIsSelected(DependencyObject element)。 如果应用程序有多个 Dispatcher 线程,则 .NET Framework 4.5 中可能会发生此异常。 在 .NET Framework 4.7 中,也可能在具有单个 Dispatcher 线程的应用程序中发生该异常。

此问题已在 .NET Framework 4.7.1 中解决。

建议

升级到 .NET Framework 4.7.1。

名称
范围 次要
Version 4.7
类型 运行时

受影响的 API

无法通过 API 分析检测到。

DataGridCellsPanel.BringIndexIntoView 引发 ArgumentOutOfRangeException

详细信息

启用列虚拟化但尚未确定列宽时,ScrollIntoView(Object) 将以异步方式执行工作。 如果在异步工作执行之前删除列,可能会出现 System.ArgumentOutOfRangeException

建议

以下任一项:

  • 升级到 .NET Framework 4.7。
  • 安装 .NET Framework 4.6.2 的最新服务修补程序。
  • 在对 ScrollIntoView(Object) 的异步响应完成前,避免删除列。
名称
范围 边缘
Version 4.6.2
类型 运行时

受影响的 API

WPF 拼写检查器引发的 ObjectDisposedException

详细信息

应用程序关闭,拼写检查器引发 System.ObjectDisposedException,在这期间,WPF 应用程序有时会出现故障。 .NET Framework 4.7 WPF 中已通过妥善处理异常解决了此问题,因此确保了应用程序不再受到不良影响。 应注意,在调试器控制下运行的应用程序中会继续观察到偶尔引发的最可能异常。

建议

升级到 .NET Framework 4.7

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

受影响的 API

无法通过 API 分析检测到。

重设网格大小可能会导致应用程序变得无响应

详细信息

出现以下情况时,在 T:System.Windows.Controls.Grid 布局期间可能会发生无限循环:

  • 行定义包含两个 *-行,各声明一个 MinHeight 和一个 MaxHeight。
  • *-行的内容不超过相应的 MaxHeight。
  • 第一个 MinHeight(加上其他任何固定行或自动行)超过了网格的可用高度。
  • 此应用面向 .NET Framework 4.7,或通过设置 Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false 选择启用 4.7 分配算法。

在超过两行时或在列出现类似情况时,也可能发生该循环。 此问题已在 .NET Framework 4.7.1 中解决。

建议

升级到 .NET Framework 4.7.1。 或者,如果不需要 4.7 分配算法,也可以使用以下配置设置:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
名称
范围 边缘
Version 4.7
类型 运行时

受影响的 API

无法通过 API 分析检测到。

本地化版本中的 RibbonGroup 背景设置为透明

详细信息

始终用透明画笔绘制本地化版本上的 System.Windows.Controls.Ribbon.RibbonGroup 背景,导致 UI 体验不佳。 .NET Framework 4.7 WPF 修复中通过更新 System.Windows.Controls.Ribbon.RibbonGroup 本地化资源修复了此问题,因而又确保会选中正确的画笔。

建议

升级到 .NET Framework 4.7

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

受影响的 API

无法通过 API 分析检测到。

WPF 打印堆栈更新

详细信息

WPF 打印 API 现在使用 System.Printing.PrintQueue 调用窗口的打印文档包 API,以支持现已弃用的 XPS 打印 API。 这一更改是基于可维护性考虑的,因此用户和开发者应该都不会看到任何行为或 API 使用变化。 当在 Windows 10 创意者更新中运行时,此新打印堆栈默认情况下处于启用状态。 在旧版 Windows 中,旧打印堆栈将继续像过去一样运行。

建议

若要在 Windows 10 创意者更新中使用旧堆栈,请将 HKEY_CURRENT_USER\Software\Microsoft\.NETFramework\Windows Presentation Foundation\Printing 注册表项的 UseXpsOMPrinting REG_DWORD 值设置为 1

名称
范围 边缘
Version 4.7
类型 运行时

受影响的 API

无法通过 API 分析检测到。

Windows Workflow Foundation (WF)

在某些情况下工作流现在引发原始异常,而不是 NullReferenceException

详细信息

在 .NET Framework 4.6.2 和更低版本中,当工作流活动的 Execute 方法引发 Message 属性 null 值的异常,那么 System.Activities 工作流运行时引发 System.NullReferenceException 掩码原始异常。在 .NET Framework 4.7 中,引发之前掩码的异常。

建议

如果你的代码依赖于处理 System.NullReferenceException,请将其更改为捕获自定义活动可能引发的异常。

名称
范围 次要
Version 4.7
类型 运行时

受影响的 API

工作流 SQL 持久性添加主键群集并在某些列中禁止 null 值

详细信息

从 .NET Framework 4.7 起,SqlWorkflowInstanceStoreSchema.sql 脚本为 SQL 工作流实例存储 (SWIS) 创建的表格使用群集主键。 因此,标识不支持 null 值。 此更改不影响 SWIS 操作。 进行了更新以支持 SQL Server 事务复制。

建议

若要体验此更改,SQL 文件 SqlWorkflowInstanceStoreSchemaUpgrade.sql 必须应用到现有安装。 新数据库安装自动具有此更改。

名称
范围 边缘
Version 4.7
类型 运行时

受影响的 API

无法通过 API 分析检测到。

.NET Framework 4.7.1

JIT

传递和比较 UInt16 值时,代码生成不正确

详细信息

由于 .NET Framework 4.7 中引入了更改,在某些情况下,.NET Framework 4.7 上运行的应用程序中由 JIT 编译器生成的代码错误地比较了两个 T:System.UInt16 值。 有关详细信息,请参阅 GitHub.com 上的问题 #11508:传递和比较 ushort 参数时不提示错误 codegen

建议

如果在 .NET Framework 4.7 中比较 16 位无符号值时遇到问题,请升级到 .NET Framework 4.7.1。

名称
范围 边缘
Version 4.7
类型 运行时

受影响的 API

无法通过 API 分析检测到。

安全性

RSACng 和 DSACng 在部分信任方案中再次可用

详细信息

某些情况下 CngLightup(在多个更高级别的加密 API 中使用,例如 System.Security.Cryptography.Xml.EncryptedXml)和 System.Security.Cryptography.RSACng 依赖完全信任。 其中包括未断言 SecurityPermissionFlag.UnmanagedCode 权限的 P/Invoke 和 System.Security.Cryptography.CngKey 在其中有 SecurityPermissionFlag.UnmanagedCode 权限要求的代码路径。 自 .NET Framework 4.6.2 起,CngLightup 尽可能用于切换到 System.Security.Cryptography.RSACng。 结果,成功使用 System.Security.Cryptography.Xml.EncryptedXml 的部分信任应用开始失败并引发 SecurityException 异常。此更改添加所需断言,以便所有使用 CngLightup 的函数都有所需权限。

建议

如果 .NET Framework 4.6.2 中的此更改对部分信任应用有负面影响,请升级到 .NET Framework 4.7.1。

名称
范围 边缘
Version 4.6.2
类型 运行时

受影响的 API

Windows Communication Foundation (WCF)

如果 addressHeader 元素为 null,则 WCF AddressHeaderCollection 现在引发 ArgumentException

详细信息

自 .NET Framework 4.7.1 起,如果有一个元素为 nullAddressHeaderCollection(IEnumerable<AddressHeader>) 构造函数就会引发 ArgumentException。 在 .NET Framework 4.7 和更低版本中,不引发异常。

建议

如果在包含此更改的 .NET Framework 4.7.1 或更高版本中遇到兼容性问题,可以通过在 app.config 文件的 <runtime> 部分添加下面的代码行选择退出它:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableAddressHeaderCollectionValidation=true" />
  </runtime>
</configuration>
名称
范围 次要
Version 4.7.1
类型 运行时

受影响的 API

WCF MsmqSecureHashAlgorithm 现在的默认值为 SHA256

详细信息

自 .NET Framework 4.7.1 起,Msmq 消息 WCF 中的默认消息签名算法为 SHA256。 在 .NET Framework 4.7 和更低版本中,默认消息签名算法是 SHA1。

建议

如果在 .NET Framework 4.7.1 或更高版本中遇到此更改的兼容性问题,可以将以下行添加到 app.config 文件的 <runtime> 部分,以选择退出更改:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.UseSha1InMsmqEncryptionAlgorithm=true" />
  </runtime>
</configuration>
名称
范围 次要
Version 4.7.1
类型 运行时

受影响的 API

无法通过 API 分析检测到。

WCF PipeConnection.GetHashAlgorithm 现在使用 SHA256

详细信息

从 .NET Framework 4.7.1 开始,Windows Communication Foundation 使用 SHA256 哈希为命名管道生成随机名称。 在 .NET Framework 4.7 和更早版本中,它使用 SHA1 哈希。

建议

如果在 .NET Framework 4.7.1 或更高版本中遇到此更改的兼容性问题,则可以通过将以下行添加到 app.config 文件的 <runtime> 部分选择弃用此更改:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.UseSha1InPipeConnectionGetHashAlgorithm=true" />
  </runtime>
</configuration>
名称
范围 次要
Version 4.7.1
类型 运行时

受影响的 API

无法通过 API 分析检测到。

Windows Presentation Foundation (WPF)

StaysOpen=False 的链接弹出窗口

详细信息

在弹出窗口外部单击时,StaysOpen=False 的弹出窗口应该关闭。 当链接两个或更多此类弹出窗口时(即一个包含另一个),会出现很多问题,包括:

  • 打开两个级别,在 P2 外部单击,但却在 P1 内。 没有反应。
  • 打开两个级别,在 P1 外部单击。 两个弹出窗口关闭。
  • 打开和关闭两个级别。 然后尝试再次打开 P2。 没有反应。
  • 尝试打开三个级别。 无法打开。 (要么不执行任何操作,要么前两个级别关闭,具体取决于单击的位置。)

这些情况(及其他变体情况)现在按预期方式工作。

名称
范围 边缘
Version 4.7.1
类型 运行时

受影响的 API

从自定义 INCC 集合删除项时选择器出现故障

详细信息

T:System.InvalidOperationException 会在以下方案中发生:

  • T:System.Windows.Controls.Primitives.Selector 的 ItemsSource 是 T:System.Collections.Specialized.INotifyCollectionChanged 自定义实现的集合。
  • 从集合中删除所选的项。
  • T:System.Collections.Specialized.NotifyCollectionChangedEventArgsP:System.Collections.Specialized.NotifyCollectionChangedEventArgs.OldStartingIndex = -1(表示未知位置)。

异常的调用堆栈开始 at System.Windows.Threading.Dispatcher.VerifyAccess() at System.Windows.DependencyObject.GetValue(DependencyProperty dp) at System.Windows.Controls.Primitives.Selector.GetIsSelected(DependencyObject element)。 如果应用程序有多个 Dispatcher 线程,则 .NET Framework 4.5 中可能会发生此异常。 在 .NET Framework 4.7 中,也可能在具有单个 Dispatcher 线程的应用程序中发生该异常。

此问题已在 .NET Framework 4.7.1 中解决。

建议

升级到 .NET Framework 4.7.1。

名称
范围 次要
Version 4.7
类型 运行时

受影响的 API

无法通过 API 分析检测到。

重设网格大小可能会导致应用程序变得无响应

详细信息

出现以下情况时,在 T:System.Windows.Controls.Grid 布局期间可能会发生无限循环:

  • 行定义包含两个 *-行,各声明一个 MinHeight 和一个 MaxHeight。
  • *-行的内容不超过相应的 MaxHeight。
  • 第一个 MinHeight(加上其他任何固定行或自动行)超过了网格的可用高度。
  • 此应用面向 .NET Framework 4.7,或通过设置 Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false 选择启用 4.7 分配算法。

在超过两行时或在列出现类似情况时,也可能发生该循环。 此问题已在 .NET Framework 4.7.1 中解决。

建议

升级到 .NET Framework 4.7.1。 或者,如果不需要 4.7 分配算法,也可以使用以下配置设置:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
名称
范围 边缘
Version 4.7
类型 运行时

受影响的 API

无法通过 API 分析检测到。

.NET Framework 4.7.2

核心

允许在类似于 UNC 共享的 URI 中使用 Unicode

详细信息

System.Uri 中,构造包含 UNC 共享名称和 Unicode 字符的文件 URI 将不再导致出现内部状态无效的 URI。 仅当以下各项均为 true 时,该行为才会更改:

  • URI 具有方案 file:,且后接四个及以上的斜杠。
  • 主机名称以下划线或其他非保留符号开头。
  • URI 包含 Unicode 字符。

建议

使用始终包含 Unicode 的 URI 的应用程序可能已使用此行为来禁止对 UNC 共享的引用。 这些应用程序应使用 IsUnc

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

受影响的 API

存在 Unicode 时支持特殊的相对 URI 表示法

详细信息

如果在包含 Unicode 的某些相对 URI 上调用 TryCreate,则 Uri 将不再引发 NullReferenceException。 下面是重现 NullReferenceException 最简单的做法,其中两个语句是等效的:

bool success = Uri.TryCreate("http:%C3%A8", UriKind.RelativeOrAbsolute, out Uri href);
bool success = Uri.TryCreate("http:è", UriKind.RelativeOrAbsolute, out Uri href);

若要重现 NullReferenceException,以下各项必须为 true:

  • 必须将 URI 指定为相对,方法是在其前追加“http:”,且其后不跟“//”。
  • URI 必须包含百分比编码的 Unicode 或未保留的符号。

建议

根据此行为禁用相对 URI 的用户应在创建 URI 时转而指定 UriKind.Absolute

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

受影响的 API

运行时

改进了 Net.Tcp 证书身份验证的 WCF 链信任证书验证

详细信息

.NET Framework 4.7.2 改进了通过 WCF 对传输安全性使用证书身份验证时的链信任证书验证。 由于此改进,用于对服务器进行身份验证的客户端证书必须为客户端身份验证进行配置。 同样,用于对服务器进行身份验证的服务器证书必须为服务器身份验证进行配置。 由于此更改,如果禁用根证书,证书链验证将失败。 相同的更改还通过 Windows 安全汇总应用于 .NET Framework 3.5 及更高版本。 可在此处了解详细信息。此更改默认开启,可通过配置设置关闭。

建议

  • 验证服务器和客户端证书是否具有所需的 EKU OID。 如果没有,请更新证书。

  • 验证根证书是否无效。 如果是这样,请更新根证书。

  • 如果无法更新证书,可以使用以下配置设置暂时绕过中断性变更。 但是,选择退出更改将导致系统容易出现安全性问题。

    <appSettings>
      <add key="wcf:useLegacyCertificateUsagePolicy" value="true" />
    </appSettings>
    
名称
范围 次要
版本 4.7.2
类型 运行时

受影响的 API

无法通过 API 分析检测到。

Web 应用程序

.NET Framework 4.7.2 中默认启用 "dataAnnotations:dataTypeAttribute:disableRegEx" 应用设置

详细信息

.NET Framework 4.6.1 中引入了应用设置 (dataAnnotations:dataTypeAttribute:disableRegEx),允许用户在数据类型属性(如 System.ComponentModel.DataAnnotations.EmailAddressAttributeSystem.ComponentModel.DataAnnotations.UrlAttributeSystem.ComponentModel.DataAnnotations.PhoneAttribute)中禁用正则表达式。 这有助于减少安全漏洞,如可避免使用特定正则表达式进行拒绝服务攻击的可能性。
在 .NET Framework 4.6.1 中,禁用 RegEx 使用这项应用设置默认设置为 false。 从 .NET Framework 4.7.2 开始,此配置开关默认设置为 true,以进一步减少面向 .NET Framework 4.7.2 及更高版本的 Web 应用程序的安全漏洞。

建议

如果发现升级到 .NET Framework 4.7.2 后 Web 应用程序中的正则表达式不起作用,则可将 dataAnnotations:dataTypeAttribute:disableRegEx 设置的值更新为 false,从而还原到之前的行为。

<configuration>
<appSettings>
...
<add key="dataAnnotations:dataTypeAttribute:disableRegEx" value="false"/>
...
</appSettings>
</configuration>
“属性”
范围 次要
版本 4.7.2
类型 运行时

受影响的 API

无法通过 API 分析检测到。

Windows Presentation Foundation (WPF)

WPF 中改进的 Keytip 行为

详细信息

已修改 Keytip 行为,以便对 Microsoft Word 和 Windows 资源管理器行为进行奇偶校验。 通过在按下 SystemKey(特别是 KeyF11)的情况下检查是否启用 keytip 状态,WPF 可正确地处理 keytip 键。 现在,即使是通过鼠标打开的菜单,keytip 也可将其关闭。

建议

不可用

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

受影响的 API

无法通过 API 分析检测到。