本文列出了 .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 的 System.Web.UI.WebControls.GridView.AllowCustomPaging 时不会触发。
建议
此问题已在 .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)。 或者,可以将应用修改为允许分页(不是自定义分页),因为该方案不演示此问题。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.5 |
类型 | 运行时 |
受影响的 API
核心
在 .NET Framework 4.5 中使用 NetDataContractSerializer 序列化的 ConcurrentDictionary 无法通过 .NET Framework 4.5.1 或 4.5.2 反序列化
详细信息
由于对类型作了内部更改,因此在 .NET Framework 4.5 中使用 ConcurrentDictionary<TKey,TValue> 序列化的 System.Runtime.Serialization.NetDataContractSerializer 对象无法在 .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 即可解决该问题。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.5.1 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测。
AppDomainSetup.DynamicBase 不再通过 UseRandomizedStringHashAlgorithm 进行随机化
详细信息
在 .NET Framework 4.6 之前, DynamicBase 如果在应用的配置文件中启用了 UseRandomizedStringHashAlgorithm,则会在应用程序域之间或进程之间随机化该值。 从 .NET Framework 4.6 开始, DynamicBase 将在运行的应用的不同实例和不同应用域之间返回稳定的结果。 对于不同的应用,动态基础仍将有所不同;此更改仅删除同一应用的不同实例的随机命名元素。
建议
请注意,启用 UseRandomizedStringHashAlgorithm
不会导致 DynamicBase 随机化。 如果需要随机基数,则必须在应用的代码而不是通过此 API 生成它。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
调用 Attribute.GetCustomAttributes 在索引器属性上将不会再引发 AmbiguousMatchException,如果可以通过索引的类型来解析模糊性。
详细信息
在 .NET Framework 4.6 之前,调用索引器属性 GetCustomAttribute(s)
,如果该属性仅在索引类型上与另一个属性不同,将导致 System.Reflection.AmbiguousMatchException。 从 .NET Framework 4.6 开始,属性特征将会正确返回。
建议
请注意,GetCustomAttribute(s) 现在将更频繁地工作。 如果应用程序以前依赖于 System.Reflection.AmbiguousMatchException,现在应使用反射来显式查找多个索引器。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 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 即可解决该问题。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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 即可解决该问题。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 4.5 |
类型 | 运行时 |
受影响的 API
波斯历现在使用 Hijri 太阳算法
详细信息
从 .NET Framework 4.6 开始,该 System.Globalization.PersianCalendar 类使用 Hijri 太阳能算法。 自 .NET Framework 4.6 起,对于早于 1800 年或晚于 2023 年(公历)的日期,在 System.Globalization.PersianCalendar 和其他日历之间转换日期所得结果可能略微不同。此外,PersianCalendar.MinSupportedDateTime 现在为 March 22, 0622
,而不是 March 21, 0622
。
建议
请注意,在 .NET Framework 4.6 中使用波斯语Calendar 时,某些早期或后期日期可能略有不同。 此外,当序列化可能在不同的 .NET Framework 版本上运行的进程之间的日期时,请不要将它们存储为波斯语Calendar 日期字符串(因为这些值可能不同)。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
无法再将反射对象从托管代码传递到进程外 DCOM 客户端
详细信息
无法再将反射对象从托管代码传递到进程外 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
。
建议
更新封送代码,以与非反射对象一起使用。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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,则可以将其显式设置为该值。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
现在,当 .NET 无法处理证书时,不会引发 X509Certificate2.ToString(Boolean)
详细信息
在 .NET Framework 4.5.2 及更早版本中,如果为详细参数传递了 true
,并且安装了 .NET Framework 不支持的证书,则会引发此方法。 现在,该方法将成功并返回一个有效的字符串,该字符串省略证书的不可访问部分。
建议
应更新任何依赖 X509Certificate2.ToString(Boolean) 的代码,以希望返回的字符串会排除在某些情况下,API 之前曾引发的某些证书数据(例如公钥、私钥和扩展)。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
数据
尝试 TCP/IP 连接到解析为 localhost
的 SQL Server 数据库时失败
详细信息
在 .NET Framework 4.6 和 4.6.1 中,尝试通过 TCP/IP 连接到解析结果为 localhost
的 SQL Server 数据库时失败,并出现错误:“建立与 SQL Server 的连接时出现与网络相关的或特定于实例的错误。” 找不到服务器或无法访问服务器。 请验证实例名称是否正确,SQL Server 是否已配置为允许远程连接。 (提供程序:SQL 网络接口,错误:26——定位服务器/指定实例时出错)
建议
此问题已得到解决,在 .NET Framework 4.6.2 中还原了以前的行为。 若要连接到解析 localhost
为的 SQL Server 数据库,请升级到 .NET Framework 4.6.2。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测。
调试器
在执行后一个步骤时才能在调试器中看到空联合器值
详细信息
在 64 位版本的 Framework 上运行时,.NET Framework 4.5 中的 bug 导致在执行分配操作后无法立即在调试器中看到通过空联合操作设置的值。
建议
在调试器中多单步执行一次将正确更新本地/字段的值。 另外,此问题已在 .NET Framework 4.6 中解决;因此升级到该版本的 Framework 即可解决该问题。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 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(如果可能)。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
序列化
在未知类型的情况下,DataContract 序列化失败的异常消息已更改
详细信息
从 .NET Framework 4.6 开始,如果System.Runtime.Serialization.DataContractSerializerSystem.Runtime.Serialization.Json.DataContractJsonSerializer由于缺少“已知类型”而无法序列化或反序列化,则给出的异常消息已被澄清。
建议
应用不应依赖于特定的异常消息。 如果应用依赖于此消息,请更新它以预期新消息,或者(最好)将其更改为仅依赖于异常类型。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 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。 以下是详细的更改:
- 对于 .NET Framework 4.6 及其次要版本,
Version
键中的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
条目的值已更改为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.0.30319.x 更改为 .NET Framework 4.6 和其小版本的 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 的安装路径,请使用
InstallPath
密钥中的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
条目的值。
重要
子项名称是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。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测。
在注册表中注册自身时,.NET Framework 4.6 不使用 4.5.x.x 版本
详细信息
如预期的那样,.NET Framework 4.6 的注册表(at HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full
)中设置的版本密钥以“4.6”开头,而不是“4.5”。 依赖于这些注册表项的应用知道计算机上安装了哪些 .NET Framework 版本应更新,以了解 4.6 是一个可能的新版本,并且与以前的 4.5.x 版本兼容。
建议
通过查找 4.5 注册表项来更新探测 .NET Framework 4.5 安装的应用,从而也可以接受 4.6。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测。
Windows Communication Foundation (WCF)
将 NETTCP 与 SSL 安全性和 MD5 证书身份验证配合使用的 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 哈希算法的证书被视为不安全。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测。
Windows Presentation Foundation (WPF)
从 DataGrid 的 UnloadingRow 事件的处理程序访问 WPF DataGrid 的选定项可能会导致 NullReferenceException
详细信息
由于 .NET Framework 4.5 中的 bug,涉及删除行的 DataGrid 事件的事件处理程序如果访问 System.NullReferenceException 的 DataGrid 或 System.Windows.Controls.Primitives.Selector.SelectedItem 属性,可能会导致引发 System.Windows.Controls.Primitives.MultiSelector.SelectedItems。
建议
此问题已在 .NET Framework 4.6 中解决,因此升级到该版本的 .NET Framework 即可解决该问题。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
ObservableCollection<T>.Move 的 ListBoxItem IsSelected 绑定问题
详细信息
在绑定到有选中项的 Move(Int32, Int32) 的集合上调用 MoveItem(Int32, Int32) 或 System.Windows.Controls.ListBox 可能导致未来选择或不选 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 即可解决该问题。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.5 |
类型 | 运行时 |
受影响的 API
右键单击 WPF DataGrid 行标题更改 DataGrid 选择
详细信息
在选中多行时,右键单击所选的 System.Windows.Controls.DataGrid 行标题会导致 System.Windows.Controls.DataGrid 更改为仅选择该行。
建议
此问题已在 .NET Framework 4.6 中解决,因此升级到该版本的 .NET Framework 即可解决该问题。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 4.5 |
类型 | 运行时 |
受影响的 API
WPF 生成可冻结鼠标的 wisptis.exe 进程
详细信息
4\.5.2 中引入了一个问题,导致生成可冻结鼠标输入的 wisptis.exe
。
建议
.NET Framework 4.5.2 的服务版本(修补程序汇总 3026376)中提供了此问题的修补程序,也可通过升级到 .NET Framework 4.6 解决此问题
名称 | 价值 |
---|---|
范围 | 主要 |
版本 | 4.5.2 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测。
支持文本的控件中的 WPF 拼写检查在 Windows 10 中将不适用于 OS 输入语言列表以外的语言
详细信息
在 Windows 10 上运行时,拼写检查器可能无法用于启用 WPF 文本的控件,因为平台拼写检查功能仅适用于输入语言列表中存在的语言。在 Windows 10 中,将语言添加到可用键盘列表中时,Windows 会自动下载并安装相应的按需功能(FOD)包,该包提供拼写检查功能。 通过将语言添加到输入语言列表,将支持拼写检查器。
建议
请注意,必须添加要进行拼写检查的语言或文本作为输入语言,以便进行拼写检查才能在 Windows 10 中工作。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测。
当 WPF 窗口超出单个显示屏时,会不经剪辑就呈现该窗口
详细信息
在 Windows 8 及更高版本上运行的 .NET Framework 4.6 中,在多显示器环境下,如果窗口扩展到超出单个显示器的范围,将完整呈现而不会被裁剪。 这与先前版本的 .NET Framework 不同,以前的版本在 WPF 窗口超出单个显示屏时会剪辑该窗口。
建议
可以使用应用程序的配置文件中的 <EnableMultiMonitorDisplayClipping>
的 <appSettings>
元素,或在应用启动时设置 EnableMultiMonitorDisplayClipping
属性,显式设置此行为(无论剪辑与否)。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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:“检测到在方法中调用了 'System.String.IsNullOrWhiteSpace(System.String)',但该方法没有 [Pure] 属性。” 这是编译器警告而非编译器错误。
建议
GitHub 问题 #339 中解决了此行为。 若要消除此警告,可以从 GitHub 下载并编译代码协定工具的源代码的更新版本。 下载信息位于页面底部。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.6.1 |
类型 | 运行时 |
受影响的 API
WPF 拼写检查器引发的 ObjectDisposedException
详细信息
WPF 应用程序在关闭期间偶尔会崩溃,由拼写检查器抛出 System.ObjectDisposedException。 这在 .NET Framework 4.7 WPF 中进行了修复,方法是正常处理异常,从而确保应用程序不再受到不利影响。 应注意的是,在调试器下运行的应用程序中,偶尔会继续观察到首次发生异常。
建议
升级到 .NET Framework 4.7
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 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 开始,以这种方式启动的应用程序将不再意外崩溃 ,而是以无提示方式禁用拼写检查器。 问题 #3 - .NET Framework 4.6.2 中已修复此问题。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 4.6.1 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测。
.NET Framework 4.6.2
数据
尝试 TCP/IP 连接到解析为 localhost
的 SQL Server 数据库时失败
详细信息
在 .NET Framework 4.6 和 4.6.1 中,尝试通过 TCP/IP 连接到解析结果为 localhost
的 SQL Server 数据库时失败,并出现错误:“建立与 SQL Server 的连接时出现与网络相关的或特定于实例的错误。” 找不到服务器或无法访问服务器。 请验证实例名称是否正确,SQL Server 是否已配置为允许远程连接。 (提供程序:SQL 网络接口,错误:26——定位服务器/指定实例时出错)
建议
此问题已得到解决,在 .NET Framework 4.6.2 中还原了以前的行为。 若要连接到解析 localhost
为的 SQL Server 数据库,请升级到 .NET Framework 4.6.2。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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. 来还原以前的行为。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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 字符类别的逻辑。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 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。
建议
如果验证失败且此方法返回 FalseSystem.Security.Cryptography.CryptographicException,应改为执行依赖处理 而实现执行的任意代码。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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派生的类型,因为文档处理程序可能无法处理这些内容。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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 的协议列表中。 所有现有客户端都应能够至少使用 TLS1.0 协商连接。
建议
如果需要 Ssl3,请使用以下配置机制之一将 Ssl3 添加到协商协议列表中。
- SslProtocols
- SslProtocols
- < 的 >transport
- <sslStreamSecurity>
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 4.6.2 |
类型 | 运行时 |
受影响的 API
Windows Presentation Foundation (WPF)
更改 TextBlock 控件父级的 IsEnabled 属性会影响任何子控件
详细信息
从 .NET Framework 4.6.2 开始,更改System.Windows.UIElement.IsEnabled控件父级的属性会影响System.Windows.Controls.TextBlock控件的任何子控件(如超链接和按钮)。在 .NET Framework 4.6.1 和更早版本中,容器System.Windows.Controls.TextBlock内的控件并不总是反映System.Windows.UIElement.IsEnabled父级属性System.Windows.UIElement.IsEnabled的状态。
建议
没有。 此更改符合在 System.Windows.Controls.TextBlock 控件中的控件的预期行为。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.6.2 |
类型 | 运行时 |
受影响的 API
CoerceIsSelectionBoxHighlighted
详细信息
某些涉及System.Windows.Controls.ComboBox及其数据源的操作序列可能会导致System.NullReferenceException。
建议
如果可能,请升级到 .NET Framework 4.6.2。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 4.6 |
类型 | 运行时 |
受影响的 API
DataGridCellsPanel.BringIndexIntoView 抛出 ArgumentOutOfRangeException
详细信息
ScrollIntoView(Object) 启用列虚拟化但尚未确定列宽时,将以异步方式工作。 如果在异步工作发生之前删除列,可能会发生System.ArgumentOutOfRangeException。
建议
以下任一项:
- 升级到 .NET Framework 4.7。
- 安装 .NET Framework 4.6.2 的最新服务修补程序。
- 在异步响应 ScrollIntoView(Object) 完成之前,避免删除列。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 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 的版本中,滚动操作仅使用候选偏移,即使不再位于此处或右边缘,也不例外。 这会导致滚动拇指“弹跳”等效果,最好通过示例进行演示。 假设 a 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 值)。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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。
名称 | 价值 |
---|---|
范围 | 轻微 |
版本 | 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
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 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 开始,以这种方式启动的应用程序将不再意外崩溃 ,而是以无提示方式禁用拼写检查器。 问题 #3 - .NET Framework 4.6.2 中已修复此问题。
名称 | 价值 |
---|---|
范围 | Microsoft Edge |
版本 | 4.6.1 |
类型 | 运行时 |
受影响的 API
无法通过 API 分析检测。