针对到 .NET Framework 4.6.x 迁移的运行时更改
本文列出了 .NET Framework 4.6、4.6.1 和 4.6.2 中引入的应用兼容性问题。
.NET Framework 4.6
ASP.NET
AllowCustomPaging 设为 true 的 GridViews 可能在离开视图最后一页时触发 PageIndexChanging 事件
详细信息
.NET Framework 4.5 中的 bug 导致 System.Web.UI.WebControls.GridView.PageIndexChanging 有时在遇到已启用 System.Web.UI.WebControls.GridView.AllowCustomPaging 的 System.Web.UI.WebControls.GridView 时不会触发。
建议
此问题已在 .NET Framework 4.6 中解决,因此升级到该版本的 .NET Framework 即可解决该问题。 作为解决方法,应用可以对任何满足以下条件的 Page_Load
执行显式 BindGrid(System.Web.UI.WebControls.GridView 在最后一页且 LastSystem.Web.UI.WebControls.GridView.PageSize 不同于 System.Web.UI.WebControls.GridView.PageSize)。 或者,可以将应用修改为允许分页(不是自定义分页),因为该方案不演示此问题。
“属性” | 值 |
---|---|
范围 | 次要 |
Version | 4.5 |
类型 | 运行时 |
受影响的 API
核心
在 .NET Framework 4.5 中使用 NetDataContractSerializer 序列化的 ConcurrentDictionary 无法通过 .NET Framework 4.5.1 或 4.5.2 反序列化
详细信息
由于对类型作了内部更改,因此在 .NET Framework 4.5 中使用 System.Runtime.Serialization.NetDataContractSerializer 序列化的 ConcurrentDictionary<TKey,TValue> 对象无法在 .NET Framework 4.5.1 或 .NET Framework 4.5.2 中反序列化。注意,反之则可行(可以通过 .NET Framework 4.5.x 序列化,然后通过 .NET Framework 4.5 反序列化)。 同样,使用 .NET Framework 4.6 可以实现所有 4.x 的跨版本序列化,单个版本的 .NET Framework 的序列化和反序列化不受影响。
建议
如果需要在 .NET Framework 4.5 和 .NET Framework 4.5.1/4.5.2 之间序列化和反序列化 System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue>,应使用 System.Runtime.Serialization.DataContractSerializer 之类的不同序列化程序,而非使用 System.Runtime.Serialization.NetDataContractSerializer。 或者,由于此问题已在 .NET Framework 4.6 中解决,因此升级件到该版本的 .NET Framework 即可解决该问题。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.5.1 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
UseRandomizedStringHashAlgorithm 不再由 AppDomainSetup.DynamicBase 进行随机化
详细信息
在 .NET Framework 4.6 之前,如果在应用的配置文件中启用了 UseRandomizedStringHashAlgorithm,那么 DynamicBase 的值会在应用程序域或者进程之间进行随机化。 自 .NET Framework 4.6 起,DynamicBase 将在运行的应用的不同实例之间,以及在不同的应用域之间返回一个稳定的结果。 不同应用的动态基各不相同;此更改仅删除相同应用的不同实例的随机命名元素。
建议
请注意,启用 UseRandomizedStringHashAlgorithm
不会导致随机化 DynamicBase。 如果需要随机基,则必须在应用代码中生成它,而不是通过此 API 生成。
名称 | 值 |
---|---|
范围 | 边缘 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
如果多义性可按索引类型进行解析,则在索引器属性上调用 Attribute.GetCustomAttributes 将不再引发 AmbiguousMatchException
详细信息
在 .NET Framework 4.6 之前的版本中,在仅按索引类型划分区别的索引器属性上调用 GetCustomAttribute(s)
将引发 System.Reflection.AmbiguousMatchException。 从 .NET Framework 4.6 开始,将正确返回该属性的属性。
建议
请注意,GetCustomAttribute 现在将更频繁地运行。 如果应用以前依赖于 System.Reflection.AmbiguousMatchException,现在应改用反射以显式查找多个索引器。
名称 | 值 |
---|---|
范围 | 边缘 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
- Attribute.GetCustomAttribute(MemberInfo, Type)
- Attribute.GetCustomAttribute(MemberInfo, Type, Boolean)
- Attribute.GetCustomAttributes(MemberInfo)
- Attribute.GetCustomAttributes(MemberInfo, Boolean)
- Attribute.GetCustomAttributes(MemberInfo, Type)
- Attribute.GetCustomAttributes(MemberInfo, Type, Boolean)
- CustomAttributeExtensions.GetCustomAttribute(MemberInfo, Type)
- CustomAttributeExtensions.GetCustomAttribute(MemberInfo, Type, Boolean)
- CustomAttributeExtensions.GetCustomAttribute<T>(MemberInfo)
- CustomAttributeExtensions.GetCustomAttribute<T>(MemberInfo, Boolean)
- CustomAttributeExtensions.GetCustomAttributes(MemberInfo)
- CustomAttributeExtensions.GetCustomAttributes(MemberInfo, Boolean)
- CustomAttributeExtensions.GetCustomAttributes(MemberInfo, Type)
- CustomAttributeExtensions.GetCustomAttributes(MemberInfo, Type, Boolean)
- CustomAttributeExtensions.GetCustomAttributes<T>(MemberInfo)
- CustomAttributeExtensions.GetCustomAttributes<T>(MemberInfo, Boolean)
探查器未枚举 COR_PRF_GC_ROOT_HANDLEs
详细信息
在 .NET Framework v4.5.1 中,分析 API RootReferences2()
错误地不会返回 COR_PRF_GC_ROOT_HANDLE
(而是返回 COR_PRF_GC_ROOT_OTHER
)。 此问题已从 .NET Framework 4.6 开始修复。
建议
此问题已在 .NET Framework 4.6 中解决,因此升级到该版本的 .NET Framework 即可解决该问题。
“属性” | 值 |
---|---|
范围 | 次要 |
Version | 4.5.1 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
ETW EventListeners 无法从具有显式关键字的提供程序中(例如 TPL 提供程序)捕获事件
详细信息
具有空白关键字掩码的 ETW EventListeners 无法从具有显式关键字的提供程序中正确捕获事件。 在 .NET Framework 4.5 中,TPL 提供程序开始提供显式关键字,引发了此问题。 在 .NET Framework 4.6 中,EventListeners 已更新,此问题不再存在。
建议
若要解决此问题,请将调用 EnableEvents(EventSource, EventLevel) 替换为调用 EnableEvents 重载,以显式指定要使用的“任意关键字”掩码:EnableEvents(eventSource, level, unchecked((EventKeywords)0xFFFFffffFFFFffff))
。
此外,此问题已在 .NET Framework 4.6 中解决,因此升级到该版本的 .NET Framework 即可解决该问题。
“属性” | 值 |
---|---|
范围 | 边缘 |
Version | 4.5 |
类型 | 运行时 |
受影响的 API
波斯日历现在使用回历太阳算法
详细信息
自 .NET Framework 4.6 起,System.Globalization.PersianCalendar 类使用回历太阳算法。 自 .NET Framework 4.6 起,对于早于 1800 年或晚于 2023 年(公历)的日期,在 System.Globalization.PersianCalendar 和其他日历之间转换日期所得结果可能略微不同。此外,PersianCalendar.MinSupportedDateTime 现在为 March 22, 0622
,而不是 March 21, 0622
。
建议
请注意,在 .NET Framework 4.6 中使用 PersianCalendar 时,某些较早或较晚的日期可能略微不同。 另外,当在不同 .NET Framework 版本上运行的进程之间序列化日期时,请勿将它们存储为 PersianCalendar 日期字符串(因为这些值可能不相同)。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
反射对象可能无法再从托管代码传递至进程外 DCOM 客户端
详细信息
反射对象可能无法再从托管代码传道至进程外客户端 以下类型将受影响:
- System.Reflection.Assembly
- System.Reflection.MemberInfo(及其派生类型,包括 System.Reflection.FieldInfo、System.Reflection.MethodInfo、System.Type 和 System.Reflection.TypeInfo)
- System.Reflection.MethodBody
- System.Reflection.Module
- System.Reflection.ParameterInfo
调用对象的 IMarshal
会返回 E_NOINTERFACE
。
建议
更新封送代码,以与非反射对象一起使用。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
- System.Reflection.Assembly
- System.Reflection.FieldInfo
- System.Reflection.MemberInfo
- System.Reflection.MethodBody
- System.Reflection.MethodInfo
- System.Reflection.Module
- System.Reflection.ParameterInfo
- System.Reflection.TypeInfo
- System.Type
默认应用域的 TargetFrameworkName 不再默认为 null(如果未设置)
详细信息
以前,除非显式设置,否则默认应用域中的 System.AppDomainSetup.TargetFrameworkName 为 null。 从 4.6 开始,默认应用域的 System.AppDomainSetup.TargetFrameworkName 属性将具有派生自 TargetFrameworkAttribute 的默认值(如果存在)。 除非显式重写,否则非默认应用域将继续从默认应用域继承 System.AppDomainSetup.TargetFrameworkName(在 4.6 中不会默认为 null)。
建议
应更新代码,以独立于默认为 null 的 TargetFrameworkName。 如果需要此属性继续评估为 null,它可显式设为该值。
名称 | 值 |
---|---|
范围 | 边缘 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
现在,当 .NET 无法处理证书时,不会引发 X509Certificate2.ToString(Boolean)
详细信息
在 .NET Framework 4.5.2 及更早版本中,如果为详细参数传递了 true
,并且安装了 .NET Framework 不支持的证书,则会引发此方法。 现在,该方法将取得成功,并返回省略证书无法访问部分的有效字符串。
建议
应更新任何依赖 X509Certificate2.ToString(Boolean) 的代码,以希望返回的字符串会排除在某些情况下,API 之前曾引发的某些证书数据(例如公钥、私钥和扩展)。
名称 | 值 |
---|---|
范围 | 边缘 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
数据
与解析为 localhost
的 SQL Server 数据库的 TCP/IP 连接尝试失败
详细信息
在 .NET Framework 4.6 和 4.6.1 中,与解析为 localhost
的 SQL Server 数据库的 TCP/IP 连接尝试失败,出现错误:“在与 SQL Server 建立连接时出现与网络相关的错误或特定于实例的错误。 找不到或无法访问服务器。 请验证实例名称是否正确,SQL Server 是否已配置为允许远程连接。 (提供程序:SQL 网络接口,错误:26 - 定位指定的服务器/实例时出错)”
建议
在 .NET Framework 4.6.2 中,此问题已得到解决,并已恢复以前的行为。 若要连接到会解析为 localhost
的 SQL Server 数据库,请升级到 .NET Framework 4.6.2。
“属性” | 值 |
---|---|
范围 | 次要 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
调试器
在执行后一个步骤时才能在调试器中看到空联合器值
详细信息
在 64 位版本的 Framework 上运行时,.NET Framework 4.5 中的 bug 导致在执行分配操作后无法立即在调试器中看到通过空联合操作设置的值。
建议
在调试器中多单步执行一次将正确更新本地/字段的值。 另外,此问题已在 .NET Framework 4.6 中解决;因此升级到该版本的 Framework 即可解决该问题。
“属性” | 值 |
---|---|
范围 | 边缘 |
Version | 4.5 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
网络
ContentDisposition DateTimes 返回稍微不同的字符串
详细信息
从 4.6 开始,已更新 System.Net.Mime.ContentDisposition 的字符串表示形式,以始终使用两位数表示 System.DateTime 的小时部分。 这是为了符合 RFC822 和 RFC2822。 这将导致在 4.6 中,当其中一个处理时间元素早于上午 10 点时,ToString() 将返回稍微不同的字符串。 请注意,ContentDispositions 有时通过将它们转换为字符串以进行序列化,因此应检查任何 ToString() 操作、序列化或 GetHashCode 调用。
建议
不要期望不同 .NET Framework 版本的 ContentDispositions 的字符串表示形式相互进行正确比较。 如果可以,请在执行比较前将字符串转换回 ContentDispositions。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
序列化
在未知类型的情况下,DataContract 序列化失败的异常消息已更改
详细信息
从 .NET Framework 4.6 开始,如果 System.Runtime.Serialization.DataContractSerializer 或 System.Runtime.Serialization.Json.DataContractJsonSerializer 由于缺少已阐明的“已知类型”而无法序列化或反序列化,则会发出异常消息。
建议
应用不应依赖于特定异常消息。 如果应用依赖于此消息,可选择更新应用以期得到新消息或(最好)将其更改为仅依赖异常类型。
名称 | 值 |
---|---|
范围 | 边缘 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
- DataContractJsonSerializer(Type)
- DataContractJsonSerializer(Type, IEnumerable<Type>)
- DataContractJsonSerializer(Type, DataContractJsonSerializerSettings)
- DataContractJsonSerializer(Type, String)
- DataContractJsonSerializer(Type, String, IEnumerable<Type>)
- DataContractJsonSerializer(Type, XmlDictionaryString)
- DataContractJsonSerializer(Type, XmlDictionaryString, IEnumerable<Type>)
- DataContractJsonSerializer(Type, IEnumerable<Type>, Int32, Boolean, IDataContractSurrogate, Boolean)
- DataContractJsonSerializer(Type, String, IEnumerable<Type>, Int32, Boolean, IDataContractSurrogate, Boolean)
- DataContractJsonSerializer(Type, XmlDictionaryString, IEnumerable<Type>, Int32, Boolean, IDataContractSurrogate, Boolean)
- DataContractSerializer(Type)
- DataContractSerializer(Type, DataContractSerializerSettings)
- DataContractSerializer(Type, IEnumerable<Type>)
- DataContractSerializer(Type, String, String)
- DataContractSerializer(Type, String, String, IEnumerable<Type>)
- DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString)
- DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString, IEnumerable<Type>)
- DataContractSerializer(Type, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate)
- DataContractSerializer(Type, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate, DataContractResolver)
- DataContractSerializer(Type, String, String, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate)
- DataContractSerializer(Type, String, String, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate, DataContractResolver)
- DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate)
- DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate, DataContractResolver)
安装和部署
.NET Framework 4.6 和更高版本中产品版本控制的更改
详细信息
产品版本控制已从早期版本的 .NET Framework 进行了更改,特别是 .NET Framework 4、4.5、4.5.1 和 4.5.2。 以下是详细更改:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
键的Version
项的值在 .NET Framework 4.6 及其子版本中已更改为4.6.xxxxx
,在 .NET Framework 4.7 和 4.7.1 中已更改为4.7.xxxxx
。 在 .NET Framework 4.5、4.5.1 和 4.5.2 中,它的格式为4.5.xxxxx
。- .NET Framework 文件的文件和产品版本控制在 .NET Framework 4.6 及其子版本中已从 4.0.30319.x 的早期版本控制方案更改为 4.6.X.0,在 .NET Framework 4.7 和 4.7.1 中已更改为 4.7.X.0。 右键单击某个文件后,查看文件的“属性”时可以看到这些新值。
- 在 .NET Framework 4.6 及其子版本中,托管程序集的 AssemblyFileVersionAttribute 和 AssemblyInformationalVersionAttribute 特性的版本值格式为 4.6.X.0,在 .NET Framework 4.7 和 4.7.1 中,格式为 4.7.X.0。
- 在 .NET Framework 4.6、4.6.1、4.6.2、4.7 和 4.7.1 中,Environment.Version 属性将返回修正后的版本字符串
4.0.30319.42000
。 在 .NET Framework 4、4.5、4.5.1 和 4.5.2 中,它返回格式为4.0.30319.xxxxx
的版本字符串(例如“4.0.30319.18010”)。 请注意,我们不建议应用程序代码对 Environment.Version 属性产生任何新的依赖关系。
有关详细信息,请参阅如何:确定安装了哪些 .NET Framework 版本。
建议
一般情况下,应用程序应依赖于用于检测诸如 .NET Framework 的运行时版本和安装目录等内容的推荐技术:
- 要检测 .NET Framework 的运行时版本,请参阅如何:确定已安装的 .NET Framework 版本。
- 若要确定 .NET Framework 的安装路径,请使用
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
密钥中的InstallPath
条目的值。
重要
子项名称是 NET Framework Setup
,而不是 .NET Framework Setup
。
- 若要确定.NET Framework 公共语言运行时的目录路径,请调用 RuntimeEnvironment.GetRuntimeDirectory() 方法。
- 若要获取 CLR 版本,请调用 RuntimeEnvironment.GetSystemVersion() 方法。 对于 .NET Framework 4 及其子版本(.NET Framework 4.5、4.5.1、4.5.2 以及 .NET Framework 4.6、4.6.1、4.6.2、4.7 和 4.7.1),它将返回字符串 v4.0.30319。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
.NET Framework 4.6 在注册表中注册自身时,不会使用 4.5.x.x 版本
详细信息
正如所料,在注册表(位于 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full
)中为 .NET Framework 4.6 设置的版本密钥以“4.6”开头,而不是“4.5”。 对于根据这些注册表项了解计算机上应安装哪些版本的 .NET Framework 的应用,应将其更新,以了解 4.6 是新的可行版本,与之前的 4.5.x 版本兼容。
建议
通过查找 4.5 注册表项来更新探测 .NET Framework 4.5 安装的应用,从而也可以接受 4.6。
名称 | 值 |
---|---|
范围 | 边缘 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
Windows Communication Foundation (WCF)
使用带有 SSL 安全和 MD5 证书身份验证的 NETTCP 的 WCF 服务
详细信息
.NET Framework 4.6 将 TLS 1.1 和 TLS 1.2 添加到 WCF SSL 默认协议列表。 客户端和服务器计算机都安装了 .NET Framework 4.6 或更高版本时,TLS 1.2 用于协商。TLS 1.2 不支持 MD5 证书身份验证。 因此,如果客户使用 MD5 证书,WCF 客户端将无法连接到 WCF 服务。
建议
可以通过执行下列任一操作来解决此问题,以便 WCF 客户端可以连接 WCF 服务器:
- 将证书更新为不使用 MD5 算法。 建议采用此解决方案。
- 如果未在源代码中动态配置绑定,将应用程序的配置文件更新为使用 TLS 1.1 或更低版本的协议。 这样便可以继续将证书和 MD5 哈希算法结合使用。
警告
不建议采用此解决方法,因为使用 MD5 哈希算法的证书被视为不安全。
下面的配置文件就采用了此解决方法:
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding>
<security mode= "None/Transport/Message/TransportWithMessageCredential" >
<transport clientCredentialType="None/Windows/Certificate"
protectionLevel="None/Sign/EncryptAndSign"
sslProtocols="Ssl3/Tls1/Tls11">
</transport>
</security>
</binding>
</netTcpBinding>
</bindings>
</system.ServiceModel>
</configuration>
- 如果在源代码中动态配置了绑定,将 TcpTransportSecurity.SslProtocols 属性更新为在源代码中使用 TLS 1.1 (SslProtocols.Tls11) 或更早版本的协议。
警告
不建议采用此解决方法,因为使用 MD5 哈希算法的证书被视为不安全。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
Windows Presentation Foundation (WPF)
从 DataGrid 的 UnloadingRow 事件的处理程序访问 WPF DataGrid 的选定项可能会导致 NullReferenceException
详细信息
由于 .NET Framework 4.5 中的 bug,涉及删除行的 DataGrid 事件的事件处理程序如果访问 DataGrid 的 System.Windows.Controls.Primitives.Selector.SelectedItem 或 System.Windows.Controls.Primitives.MultiSelector.SelectedItems 属性,可能会导致引发 System.NullReferenceException。
建议
此问题已在 .NET Framework 4.6 中解决,因此升级到该版本的 .NET Framework 即可解决该问题。
“属性” | 值 |
---|---|
范围 | 次要 |
Version | 4.5 |
类型 | 运行时 |
受影响的 API
在选定项目的 WPF ListBox、ListView 或 DataGrid 上调用 Items.Refresh 可能会导致元素中出现重复项目
详细信息
在 .NET Framework 4.5 中,在项目已在 System.Windows.Controls.ListBox 中选定的同时从代码中调用 ListBox.Items.Refresh 可能会导致选定项目在列表中重复。 System.Windows.Controls.ListView 和 System.Windows.Controls.DataGrid 会出现类似问题。 此问题已在 .NET Framework 4.6 中解决。
建议
在调用 System.Windows.Data.CollectionView.Refresh() 前以编程方式取消选择项,然后在调用完成后重新选择它们,可以解决此问题。 此外,此问题已在 .NET Framework 4.6 中解决,因此升级到该版本的 .NET Framework 即可解决该问题。
值 | |
---|---|
范围 | 次要 |
版本 | 4.5 |
类型 | 运行时 |
受影响的 API
CoerceIsSelectionBoxHighlighted
详细信息
涉及 System.Windows.Controls.ComboBox 及其数据源的某些操作序列可能会导致 System.NullReferenceException。
建议
如果可能,请升级到 .NET Framework 4.6.2。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
ObservableCollection<T>.Move 的 ListBoxItem IsSelected 绑定问题
详细信息
在绑定到有选中项的 System.Windows.Controls.ListBox 的集合上调用 Move(Int32, Int32) 或 MoveItem(Int32, Int32) 可能导致未来选择或不选 System.Windows.Controls.ListBox 项的不稳定行为。
建议
调用 System.Collections.ObjectModel.Collection<T>.Remove(T) 和 System.Collections.ObjectModel.Collection<T>.Insert(Int32, T)(而不是 Move(Int32, Int32))将解决此问题。 此外,此问题已在 .NET Framework 4.6 中解决,因此升级到该版本的 .NET Framework 即可解决该问题。
“属性” | 值 |
---|---|
范围 | 次要 |
Version | 4.5 |
类型 | 运行时 |
受影响的 API
右键单击 WPF DataGrid 行标题更改 DataGrid 选择
详细信息
在选中多行时,右键单击所选的 System.Windows.Controls.DataGrid 行标题会导致 System.Windows.Controls.DataGrid 更改为仅选择该行。
建议
此问题已在 .NET Framework 4.6 中解决,因此升级到该版本的 .NET Framework 即可解决该问题。
“属性” | 值 |
---|---|
范围 | 边缘 |
Version | 4.5 |
类型 | 运行时 |
受影响的 API
WPF 生成可冻结鼠标的 wisptis.exe 进程
详细信息
4\.5.2 中引入了一个问题,导致生成可冻结鼠标输入的 wisptis.exe
。
建议
.NET Framework 4.5.2 的服务版本(修补程序汇总 3026376)中提供了此问题的修补程序,也可通过升级到 .NET Framework 4.6 解决此问题
“属性” | 值 |
---|---|
范围 | 主要 |
Version | 4.5.2 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
支持文本的控件中的 WPF 拼写检查在 Windows 10 中将不适用于 OS 输入语言列表以外的语言
详细信息
在 Windows 10 上运行时,拼写检查器可能不适用于支持 WPF 文本的控件,因为平台拼写检查功能仅适用于输入语言列表中的语言。在 Windows 10 中,将语言添加到可用键盘的列表时,Windows 自动下载并安装相应的按需功能 (FOD) 包,以提供拼写检查功能。 通过将语言添加到输入语言列表,将支持拼写检查器。
建议
请注意,必须将要进行拼写检查的语言或文本添加到输入语言以在 Windows 10 中使用拼写检查功能。
名称 | 值 |
---|---|
范围 | 边缘 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
当 WPF 窗口超出单个显示屏时,会不经剪辑就呈现该窗口
详细信息
在 Windows 8 及更高版本上运行的 .NET Framework 4.6 中,当一个窗口超出多监视器方案中的单个显示屏时,会不经剪辑就呈现整个窗口。 这与先前版本的 .NET Framework 不同,以前的版本在 WPF 窗口超出单个显示屏时会剪辑该窗口。
建议
可以使用应用程序的配置文件中的 <appSettings>
的 <EnableMultiMonitorDisplayClipping>
元素,或在应用启动时设置 EnableMultiMonitorDisplayClipping
属性,显式设置此行为(无论剪辑与否)。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
.NET Framework 4.6.1
工具
Contract.Invariant 或 Contract.Requires<TException> 不认为 String.IsNullOrEmpty 为 pure
详细信息
对于面向 .NET Framework 4.6.1 的应用,如果 Contract.Invariant 的不变协定或 Requires 的前提条件协定调用 String.IsNullOrEmpty 方法,则重写器会发出编译器警告 CC1036:“在方法中没有 [Pure] 的情况下检测到对方法‘System.String.IsNullOrWhiteSpace(System.String)’的调用。”这是编译器警告,不是编译器错误。
建议
此行为在 GitHub 问题 #339 中已得到解决。 要去除此警告,可以从 GitHub 下载并编译代码协定工具的已更新版本的源代码。 可在页面底部找到下载信息。
“属性” | 值 |
---|---|
范围 | 次要 |
Version | 4.6.1 |
类型 | 运行时 |
受影响的 API
Windows Presentation Foundation (WPF)
项滚动包含不同像素高度的项的平面列表
详细信息
当 System.Windows.Controls.ItemsControl 使用虚拟化 (IsVirtualizing=true
) 和项滚动 (ScrollUnit=Item
) 显示集合时,以及控件滚动显示像素高度不同于其相邻项的项时,System.Windows.Controls.VirtualizingStackPanel 将循环访问集合中的所有项。 UI 在此迭代期间无响应。 迭代会发生在其他情况下,甚至在之前的 .NET Framework 版本中也会发生。 例如,在以下情况下会出现上述情形:遇到像素高度不同的项时进行像素滚动 (ScrollUnit=Pixel
),以及遇到子项数量不同于其相邻项的项时进行项滚动分层数据(例如,System.Windows.Controls.TreeView 或已启用分组的 System.Windows.Controls.ItemsControl)。对于项滚动和不同像素高度的情况,.NET Framework 4.6.1 中引入了迭代以修复分层数据布局中的 bug。 如果数据采用平面结构(没有层次结构),则不需要迭代,.NET Framework 4.6.2 在这种情况下也不会执行该操作。
建议
如果迭代发生在 .NET Framework 4.6.1 中,但在以前版本中并未发生 - 也就是说,如果 System.Windows.Controls.ItemsControl 项滚动含有像素高度不同的项的平面列表 - 可采用以下两种补救措施:
- 安装 .NET Framework 4.6.2。
- 安装适用于 .NET Framework 4.6.1 的修补程序 HR 1605。
“属性” | 值 |
---|---|
范围 | 次要 |
Version | 4.6.1 |
类型 | 运行时 |
受影响的 API
WPF 拼写检查器引发的 ObjectDisposedException
详细信息
应用程序关闭,拼写检查器引发 System.ObjectDisposedException,在这期间,WPF 应用程序有时会出现故障。 .NET Framework 4.7 WPF 中已通过妥善处理异常解决了此问题,因此确保了应用程序不再受到不良影响。 应注意,在调试器控制下运行的应用程序中会继续观察到偶尔引发的最可能异常。
建议
升级到 .NET Framework 4.7
“属性” | 值 |
---|---|
范围 | 边缘 |
Version | 4.6.1 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
WPF 拼写检查以一种意想不到的方式失败
详细信息
这包括 WPF 拼写检查器的诸多问题:
- WPF 拼写检查器有时会引发 System.Runtime.InteropServices.COMException
- 当使用“以不同用户身份运行”启动应用程序时,WPF 拼写检查器会无法使用 UnauthorizedAccessException
- WPF 拼写检查器在组合词(如德语中的“Hausnummer”)中错误地标出了拼写错误。
建议
问题 #1 - 此问题已在 .NET Framework 4.6.2 中解决 问题 #2 - 当使用“以不同用户身份运行”启动应用程序时,不再支持 WPF 拼写检查器。 从 .NET Framework 4.6.2 开始,以此方式启动的应用程序将不再意外出现故障 - 而是静默禁用 WPF 拼写检查器。 问题 #3 - 此问题已在 .NET Framework 4.6.2 中解决。
“属性” | 值 |
---|---|
范围 | 边缘 |
Version | 4.6.1 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
.NET Framework 4.6.2
数据
与解析为 localhost
的 SQL Server 数据库的 TCP/IP 连接尝试失败
详细信息
在 .NET Framework 4.6 和 4.6.1 中,与解析为 localhost
的 SQL Server 数据库的 TCP/IP 连接尝试失败,出现错误:“在与 SQL Server 建立连接时出现与网络相关的错误或特定于实例的错误。 找不到或无法访问服务器。 请验证实例名称是否正确,SQL Server 是否已配置为允许远程连接。 (提供程序:SQL 网络接口,错误:26 - 定位指定的服务器/实例时出错)”
建议
在 .NET Framework 4.6.2 中,此问题已得到解决,并已恢复以前的行为。 若要连接到会解析为 localhost
的 SQL Server 数据库,请升级到 .NET Framework 4.6.2。
“属性” | 值 |
---|---|
范围 | 次要 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。
已删除 Azure SQL 数据库的连接池锁定期
详细信息
从 .NET Framework 4.6.2 起,对于发送到已知 Azure SQL 数据库(*.database.windows.net、*.database.chinacloudapi.cn、*.database.usgovcloudapi.net、*.database.cloudapi.de)的打开连接请求,删除了连接池锁定期且不会缓存打开连接错误。 在出现暂时连接错误后随即重试连接打开请求。 此更改允许立即重新尝试打开 Azure SQL 数据库的连接,从而改进了已启用云的应用的性能。 对于其他所有连接尝试,连接池阻止时间段还会继续强制执行。
在 .NET Framework 4.6.1 和早期版本中,当应用在连接到数据库过程中遇到暂时性连接失败时,无法快速重试连接,因为连接池会缓存错误,并在 5 秒至 1 分钟后重新引发该错误。 有关详细信息,请参阅 SQL Server 连接池 (ADO.NET)。 这种行为会给 Azure SQL 数据库连接带来问题,因为经常会因暂时性错误而导致连接失败,这些错误通常在几秒内便会恢复。 连接池阻止功能意味着,应用在很长一段时间内都无法连接到数据库,即使数据库可用且应用需要在几秒钟内呈现也不行。
建议
如果不需要此行为,可以通过设置 .NET Framework 4.6.2 中引入的 System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod 属性配置连接池锁定期。 该属性的值属于 System.Data.SqlClient.PoolBlockingPeriod 枚举,可采用以下三个值中的任意一个:
可以通过将 System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod 属性设置为 AlwaysBlock 来还原以前的行为。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6.2 |
类型 | 运行时 |
受影响的 API
全球化
现在支持 Unicode 标准版本 8.0 类别
详细信息
在 .NET Framework 4.6.2 中,Unicode 数据已从 Unicode 标准版本 6.3 升级到版本 8.0。 在 .NET Framework 4.6.2 中请求 Unicode 字符类别时,某些结果可能与以前的 .NET Framework 版本中的结果不匹配。 此更改主要影响切罗基语音节和西双版纳新傣文元音标记和音调标记。
建议
检查代码并删除/更改依赖硬编码 Unicode 字符类别的逻辑。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6.2 |
类型 | 运行时 |
受影响的 API
- Char.GetUnicodeCategory(Char)
- CharUnicodeInfo.GetUnicodeCategory(Char)
- CharUnicodeInfo.GetUnicodeCategory(String, Int32)
安全性
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
- DSACng(CngKey)
- DSACng.Key
- DSACng.LegalKeySizes
- DSACng.CreateSignature(Byte[])
- DSACng.VerifySignature(Byte[], Byte[])
- RSACng(CngKey)
- RSACng.Key
- RSACng.Decrypt(Byte[], RSAEncryptionPadding)
- RSACng.SignHash(Byte[], HashAlgorithmName, RSASignaturePadding)
RSACng.VerifyHash 现在为任意验证失败返回 False
详细信息
自 .NET Framework 4.6.2 起,如果签名本身格式不正确,则此方法返回 False。 现在为任意验证失败返回 false。在 .NET Framework 4.6 和 4.6.1 中,如果签名格式错误,则此方法引发 System.Security.Cryptography.CryptographicException。
建议
如果验证失败且此方法返回 False,应改为执行依赖处理 System.Security.Cryptography.CryptographicException 而实现执行的任意代码。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6.2 |
类型 | 运行时 |
受影响的 API
SignedXml 和 EncryptedXml 的重大更改
详细信息
在 .NET Framework 4.6.2 中,System.Security.Cryptography.Xml.SignedXml 和 System.Security.Cryptography.Xml.EncryptedXml 中的安全修复程序会导致不同的运行时行为。 例如:
- 如果文档包含多个具有相同
id
特性的元素,并且签名将其中一个元素作为签名根的目标,则该文档现在将视为无效。 - 在引用中使用非规范 XPath 转换算法的文档现在视为无效。
- 在引用中使用非规范 XSLT 转换算法的文档现在视为无效。
- 任何利用外部资源拆离签名的程序都无法执行此操作。
建议
开发者应该检查 XmlDsigXsltTransform 和 XmlDsigXsltTransform 以及派生自 Transform 的类型的使用情况,因为文档接收器可能无法进行处理。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6.2 |
类型 | 运行时 |
受影响的 API
- System.Security.Cryptography.Xml.Transform
- System.Security.Cryptography.Xml.XmlDsigXPathTransform
- System.Security.Cryptography.Xml.XmlDsigXsltTransform
Windows Communication Foundation (WCF)
从 WCF TransportDefaults 删除 Ssl3
详细信息
结合使用 NetTcp 与传输安全性和凭据类型证书时,SSL 3 协议不再是用于协商安全连接的默认协议。 在大多数情况下,应该不会对现有应用程序造成任何影响,因为 TLS 1.0 始终包含在 NetTcp 协议列表中。 所有现有客户端应该至少能够使用 TLS 1.0 来协商连接。
建议
如果 Ssl3 必需,则使用以下配置机制之一将 Ssl3 添加到协商协议的列表。
名称 | 值 |
---|---|
范围 | 边缘 |
Version | 4.6.2 |
类型 | 运行时 |
受影响的 API
Windows Presentation Foundation (WPF)
更改 TextBlock 控件父级的 IsEnabled 属性会影响任何子控件
详细信息
自 .NET Framework 4.6.2 起,更改 System.Windows.Controls.TextBlock 控件父级的 System.Windows.UIElement.IsEnabled 属性会影响 System.Windows.Controls.TextBlock 控件的任意子控件(例如超链接和按钮)。在 .NET Framework 4.6.1 和更早版本中,System.Windows.Controls.TextBlock 中的控件并非始终反映 System.Windows.Controls.TextBlock 父级的 System.Windows.UIElement.IsEnabled 属性状态。
建议
无。 此更改符合 System.Windows.Controls.TextBlock 控件中各控件的预期行为。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6.2 |
类型 | 运行时 |
受影响的 API
CoerceIsSelectionBoxHighlighted
详细信息
涉及 System.Windows.Controls.ComboBox 及其数据源的某些操作序列可能会导致 System.NullReferenceException。
建议
如果可能,请升级到 .NET Framework 4.6.2。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6 |
类型 | 运行时 |
受影响的 API
DataGridCellsPanel.BringIndexIntoView 引发 ArgumentOutOfRangeException
详细信息
启用列虚拟化但尚未确定列宽时,ScrollIntoView(Object) 将以异步方式执行工作。 如果在异步工作执行之前删除列,可能会出现 System.ArgumentOutOfRangeException。
建议
以下任一项:
- 升级到 .NET Framework 4.7。
- 安装 .NET Framework 4.6.2 的最新服务修补程序。
- 在对 ScrollIntoView(Object) 的异步响应完成前,避免删除列。
名称 | 值 |
---|---|
范围 | 边缘 |
Version | 4.6.2 |
类型 | 运行时 |
受影响的 API
水平滚动和虚拟化
详细信息
此更改适用于按与主滚动方向正交的方向自行执行虚拟化的 System.Windows.Controls.ItemsControl(主要示例是 EnableColumnVirtualization=True 的 System.Windows.Controls.DataGrid)。 已将特定水平滚动操作更改为生成更直观且更类似于可类比垂直滚动操作的结果。
操作包括“滚动到此处”和“滚动到右边缘”(使用右键单击水平滚动条所获得的菜单中的名称)。 这两种方法都能计算候选偏移和调用 SetHorizontalOffset(Double)。
滚动到新偏移后,“滚动到此处”或“滚动到右边缘”的概念可能会发生变化,因为反虚拟化的新内容已更改 System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth 的值。
在低于 .NET Framework 4.6.2 的版本中,滚动操作仅使用候选偏移,即使不再位于此处或右边缘,也不例外。 这会导致滚动翻阅出现“退回”等效果,最好是用举例来说明。 假设 System.Windows.Controls.DataGrid 有 ExtentWidth=1000 和 Width=200。 “滚动到右边缘”使用候选偏移 1000 - 200 = 800。 在滚动到此偏移时,新列会进行反虚拟化;假设这些列都非常宽,这样就可以将 System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth 更改为 2000。 滚动偏移最终为 HorizontalOffset=800,而翻阅退回到滚动条中间位置附近,精确位置是 800/2000 = 40%。
此更改是为了在发生此情况时重新计算新的候选偏移,并进行重试。 (垂直滚动已采用这样的做法。)
此更改为最终用户提供了更易于预测的直观体验,但还可能会影响依赖水平滚动后的 System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset 确切值的所有应用,不论水平滚动是由最终用户触发,还是由显式调用 SetHorizontalOffset(Double) 所触发。
建议
应将使用 System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset 预测值的应用更改为:在由于反虚拟化而可能更改 System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth 的任何水平滚动发生后提取实际值(和 System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth 值)。
名称 | 值 |
---|---|
范围 | 次要 |
Version | 4.6.2 |
类型 | 运行时 |
受影响的 API
Items.Clear 不会从 SelectedItems 删除重复项
详细信息
假设选择器(已启用多个选择)在其 System.Windows.Controls.Primitives.MultiSelector.SelectedItems 集合中有多个重复项(出现不止一次的相同项)。 从数据源删除这些项(例如通过调用 Items.Clear)不会从 System.Windows.Controls.Primitives.MultiSelector.SelectedItems 删除它们;仅删除第一个实例。 此外,随后使用 System.Windows.Controls.Primitives.MultiSelector.SelectedItems(例如 SelectedItems.Clear())可能会遇到 System.ArgumentException 等问题,这是因为 System.Windows.Controls.Primitives.MultiSelector.SelectedItems 包含不再出现在数据源中的项。
建议
如果可能请升级到 .NET Framework 4.6.2。
“属性” | 值 |
---|---|
范围 | 次要 |
Version | 4.5 |
类型 | 运行时 |
受影响的 API
项滚动包含不同像素高度的项的平面列表
详细信息
当 System.Windows.Controls.ItemsControl 使用虚拟化 (IsVirtualizing=true
) 和项滚动 (ScrollUnit=Item
) 显示集合时,以及控件滚动显示像素高度不同于其相邻项的项时,System.Windows.Controls.VirtualizingStackPanel 将循环访问集合中的所有项。 UI 在此迭代期间无响应。 迭代会发生在其他情况下,甚至在之前的 .NET Framework 版本中也会发生。 例如,在以下情况下会出现上述情形:遇到像素高度不同的项时进行像素滚动 (ScrollUnit=Pixel
),以及遇到子项数量不同于其相邻项的项时进行项滚动分层数据(例如,System.Windows.Controls.TreeView 或已启用分组的 System.Windows.Controls.ItemsControl)。对于项滚动和不同像素高度的情况,.NET Framework 4.6.1 中引入了迭代以修复分层数据布局中的 bug。 如果数据采用平面结构(没有层次结构),则不需要迭代,.NET Framework 4.6.2 在这种情况下也不会执行该操作。
建议
如果迭代发生在 .NET Framework 4.6.1 中,但在以前版本中并未发生 - 也就是说,如果 System.Windows.Controls.ItemsControl 项滚动含有像素高度不同的项的平面列表 - 可采用以下两种补救措施:
- 安装 .NET Framework 4.6.2。
- 安装适用于 .NET Framework 4.6.1 的修补程序 HR 1605。
“属性” | 值 |
---|---|
范围 | 次要 |
Version | 4.6.1 |
类型 | 运行时 |
受影响的 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 拼写检查器的诸多问题:
- WPF 拼写检查器有时会引发 System.Runtime.InteropServices.COMException
- 当使用“以不同用户身份运行”启动应用程序时,WPF 拼写检查器会无法使用 UnauthorizedAccessException
- WPF 拼写检查器在组合词(如德语中的“Hausnummer”)中错误地标出了拼写错误。
建议
问题 #1 - 此问题已在 .NET Framework 4.6.2 中解决 问题 #2 - 当使用“以不同用户身份运行”启动应用程序时,不再支持 WPF 拼写检查器。 从 .NET Framework 4.6.2 开始,以此方式启动的应用程序将不再意外出现故障 - 而是静默禁用 WPF 拼写检查器。 问题 #3 - 此问题已在 .NET Framework 4.6.2 中解决。
“属性” | 值 |
---|---|
范围 | 边缘 |
Version | 4.6.1 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测到。