原文地址:https://devblogs.microsoft.com/dotnet/announcing-the-net-framework-4-8/html
咱们很高兴地宣布今天发布.NET Framework 4.8。它包含在Windows 10 2019 May更新中。.NET Framework 4.8也能够在Windows 7+和Windows Server 2008 R2 +上使用。git
您能够从咱们的 .NET下载站点安装.NET 4.8 。要构建面向.NET Framework 4.8的应用程序,能够下载.NET 4.8开发人员包。若是您只想要.NET 4.8运行时,能够尝试:github
.NET Framework 4.8包含更新的工具集以及几个方面的改进:算法
您能够在.NET Framework 4.8发行说明中看到完整的改进列表 。 .NET 4.8也更新了参考源。windows
Windows客户端版本: Windows 10版本1903,Windows 10版本1809,Windows 10版本1803,Windows 10版本1709,Windows 10版本1703,Windows 10版本1607,Windows 8.1,Windows 7 SP1
Windows Server版本: Windows Server 2019,Windows Server版本1803,Windows Server 2016,Windows Server 2012,Windows Server 2012 R2,Windows Server 2008 R2 SP1api
.NET 4.8中的JIT基于.NET Core 2.1。如今,.NET Framework中提供了全部错误修复和.NET Core 2.1中许多基于代码生成的性能优化。数组
.NET Framework中的NGEN映像再也不包含可写和可执行部分。这减小了可用于经过修改将要执行的内存来执行任意代码的攻击的表面区域。性能优化
虽然在运行时内存中仍然存在可写和可执行数据,但此更改会删除从NGEN映像映射的数据,从而容许它们在不容许图像中的可执行/可写部分的受限环境中运行。并发
在之前版本的.NET Framework中,Windows Defender或第三方反恶意软件会自动扫描从磁盘加载的全部程序集以查找恶意软件。可是,从其余地方加载的程序集(例如使用Assembly.Load(byte []))将不会被扫描,而且可能会检测到未检测到的病毒。app
Windows 10上的.NET Framework 4.8会触发Windows Defender和许多其余实现反恶意软件扫描接口的反恶意软件解决方案对这些程序集的扫描。咱们但愿这会使恶意软件更难以在.NET程序中假装本身。
从.NET Framework 4.5开始,咱们使用 clrcompression.dll中http://zlib.net的ZLib本机版本(用于数据压缩的本机外部压缩库) ,以便为deflate算法提供实现。在.NET Framework 4.8中,咱们将clrcompression.dll更新为使用版本1.2.11,其中包括几个关键的改进和修复。
.NET Framework 2.0+具备加密提供程序类,例如SHA256Managed,当在“FIPS模式”下配置系统加密库时会抛出CryptographicException。抛出这些异常是由于托管版本未通过FIPS(联邦信息处理标准)140-2认证(JIT和NGEN映像生成都会使证书无效),这与系统加密库不一样。不多有开发人员将他们的开发机器置于“FIPS模式”,致使这些异常在生产(或客户系统)中引起。.NET Framework还使用“FIPS模式”设置来阻止加密算法,这些加密算法不被FIPS规则视为已批准的算法。
对于为.NET Framework 4.8构建的应用程序,将再也不抛出这些异常(默认状况下)。相反,SHA256Managed类(以及其余托管加密类)会将加密操做重定向到系统加密库。此策略更改有效地消除了开发人员环境与运行代码的生产环境之间可能存在的混淆差别,并使本机组件和托管组件在相同的加密策略下运行。
针对.NET Framework 4.8的应用程序将自动切换到较新的宽松策略,而且在“FIPS模式”下再也不会看到从MD5Cng,MD5CryptoServiceProvider,RC2CryptoServiceProvider,RIPEMD160Managed和RijndaelManaged引起的异常。依赖于先前版本的异常的应用程序能够经过将AppContext开关“Switch.System.Security.Cryptography.UseLegacyFipsThrow”设置为“true”来返回到先前的行为。
在.NET Framework 4.8中,WinForms添加了三个新功能,使开发人员可以编写更易于访问的应用程序。添加的功能旨在使视障用户的应用程序数据通讯更加健壮。当用户经过键盘导航时,咱们添加了对ToolTips的支持,咱们已将LiveRegions和Notification Events添加到许多经常使用控件中。
要启用这些功能,您的应用程序须要在App.config文件中启用如下AppContextSwitches:
UIA Live Regions容许应用程序开发人员通知屏幕阅读器控件的文本更改,该控件位于用户工做的位置以外。这将派上用场的示例能够是显示链接状态的StatusStrip。若是删除链接而且状态发生更改,开发人员可能但愿通知屏幕阅读器此更改。Windows Forms已为Label控件和StatusStrip控件实现了UIA LiveRegions。
在Label控件中使用LiveRegion的示例:
讲述者如今将宣布“准备就绪”,不管用户在何处与应用程序进行交互。
您还能够将UserControl实现为Live区域:
在Windows 10 Fall Creators Update中,Windows引入了一种新方法,让应用程序通知Narrator内容已更改,而Narrator应该宣布更改。UIA通知事件为您的应用程序提供了一种方式来引起UIA事件,这会致使讲述人根据您为事件提供的文本简单地发布通知,而无需在UI中使用相应的控件。在某些状况下,这多是一种直接提升应用程序可访问性的方法。有关UIA通知事件的更多信息,请参阅此博客文章。
通知可能派上用场的一个示例是通知可能须要一些时间的某个过程的进度。
提高通知事件的示例:
目前,只能经过将鼠标指针移动到控件中来触发控制工具提示。此新功能使键盘用户能够经过使用Tab键或带有或不带修饰键的箭头键来聚焦控件来触发控件的工具提示。此特定辅助功能加强须要额外的AppContextSwitch,如如下示例所示:
1.建立一个新的WinForms应用程序。
2.将如下XML添加到App.config文件中。
3.将几个按钮和一个ToolTip控件添加到应用程序的表单中。
4.设置按钮的工具提示。
5.运行应用程序并使用键盘在按钮之间导航:
目前,可访问的层次结构(UI自动化树)将编辑框树元素显示为当前编辑的单元格的子元素,但不显示为DataGridView的根子元素。可使用Inspect工具观察层次结构树更新:
健康端点具备许多优势,而且编排工具普遍使用它来根据服务健康情况管理服务。监控工具还可使用运行情况检查来跟踪和警告服务的可用性和性能,并将其做为早期问题指标。
ServiceHealthBehavior是一种扩展IServiceBehavior的WCF服务行为。添加到ServiceDescription.Behaviors集合后,它将启用如下内容:
配置ServiceHealthBehavior:
有两种方法能够公开运行情况端点并发布WCF服务运行情况信息:使用代码或使用配置文件。
使用HTTP响应代码返回服务运行情况:
能够经过查询参数(OnServiceFailure,OnDispatcherFailure,OnListenerFailure,OnThrottlePercentExceeded)查询运行情况。能够为每一个查询参数指定HTTP响应代码(200 - 599)。若是省略查询参数的HTTP响应代码,则默认使用503 HTTP响应代码。
查询参数和示例:
出版服务健康情况:
启用运行情况端点后,能够在html中显示服务运行情况(经过指定查询字符串:https:// contoso:81 / Service1?运行情况)或xml(经过指定查询字符串:https:// contoso: 81 / Service1?health&Xml)格式。https:// contoso:81 / Service1?health&NoContent返回空的html页面。
注意:
始终限制对服务运行情况终结点的访问是最佳作法。您可使用如下机制限制访问:
屏幕阅读器再也不宣布具备折叠或隐藏可见性的元素。若是向用户宣布这些元素,则包含具备折叠或隐藏可见性的元素的用户界面可能被屏幕阅读器误传。在.NET Framework 4.8中,WPF再也不包含UIAutomation树的Control View中的Collapsed或Hidden元素,所以屏幕阅读器没法再宣布这些元素。
在.NET Framework 4.7.2中,WPF添加了在不使用adorner层的状况下绘制TextBox和PasswordBox文本选择的功能(参见此处)。此场景中所选文本的前景色由SystemColors.HighlightTextBrush决定。
在.NET Framework 4.8中,咱们添加了一个新属性SelectionTextBrush,容许开发人员在使用基于非装饰器的文本选择时为所选文本选择特定画笔。
此属性仅适用于启用了基于非装饰器的文本选择的WPF应用程序中的TextBoxBase派生控件和PasswordBox。它不适用于RichTextBox。若是未启用基于非装饰器的文本选择,则会忽略此属性。
要使用此属性,只需将其添加到XAML代码并使用适当的画笔或绑定。
生成的文本选择以下所示:
您能够结合使用SelectionBrush和SelectionTextBrush来生成您认为合适的背景和前景的任何颜色组合。
WPF在.NET 4.8中增长了对Per-Monitor V2 DPI感知和混合模式DPI扩展的支持。有关这些Windows概念的更多信息,请参见此处。
WPF中最新的Per监视器应用程序开发指南指出,只有纯WPF应用程序能够在高DPI WPF应用程序中无缝工做,而且不彻底支持Hosted HWND和Windows Forms控件。
.NET 4.8改进了对支持混合模式DPI扩展的平台上的高DPI WPF应用程序中托管HWND和Windows Forms互操做的支持(Windows 10 v1803)。当托管HWND或Windows窗体控件建立为混合模式DPI缩放窗口时(如“ 混合模式DPI缩放和DPI感知API ”文档中所述,经过调用SetThreadDpiHostingBehavior和SetThreadDpiAwarenessContext API),能够托管此类Per-Monitor V2 WPF应用程序中的内容,并对它们进行适当调整大小和缩放。此类托管内容不会在本机DPI上呈现 - 相反,操做系统会将托管内容扩展到适当的大小。
对Per-Monitor v2 DPI感知模式的支持还容许在高DPI应用程序的本机窗口下托管(即,父级)WPF控件。Windows 10 v1607(周年记念更新)将提供Per-Monitor V2 DPI Awareness支持。当经过应用程序清单启用Per-Monitor V2 DPI Awareness模式时,Windows添加了对child-HWND的支持以接收DPI更改通知。
WPF利用此支持来确保在本机窗口下托管的控件能够响应DPI更改并自行更新。例如,在Windows窗体中托管的WPF控件或表现为Per Monitor V2的Win32应用程序 - 如今可以正确响应DPI更改并自行更新。
请注意,Windows支持Windows 10 v1803上的混合模式DPI扩展,而v1607以上版本支持Per-Monitor V2。
要试用这些功能,必须启用如下应用程序清单和AppContext标志:
1.在您的应用程序中启用Per-Monitor DPI:在app.manifest中打开Per-Monitor V2
2.在WPF中启用高DPI支持:目标.NET Framework 4.6.2或更高版本
3.在app.config中设置AppContext开关
或者,在App.Config中设置AppContextSwitch Switch.System.Windows.DoNotUsePresentationDpiCapabilityTier2OrGreater = false以启用.NET 4.8中引入的Per-Monitor V2和混合模式DPI支持。
最终App.Config中的运行时部分可能以下所示:
AppContext开关也能够在注册表中设置。您能够参考AppContext类以获取其余文档。
UIAutomation的ControllerFor属性返回一个自动化元素数组,这些元素由支持该属性的自动化元素操做。此属性一般用于自动建议可访问性。当自动化元素影响应用程序UI或桌面的一个或多个段时,将使用ControllerFor。不然,很难将控制操做的影响与UI元素相关联。此功能增长了控件为ControllerFor属性提供值的功能。
AutomationPeer中添加了一个新的虚拟方法:
要为ControllerFor属性提供值,只需覆盖此方法并返回此AutomationPeer操做的控件的AutomationPeers列表:
当前工具提示仅在用户将鼠标光标悬停在控件上时显示。在.NET Framework 4.8中,WPF添加了一项功能,可使工具提示在键盘焦点上显示,也能够经过键盘快捷键显示。
要启用此功能,应用程序须要经过AppContext开关“Switch.UseLegacyAccessibilityFeatures.3”和“Switch.UseLegacyToolTipDisplay”来定位.NET Framework 4.8或选择加入。
示例App.config文件:
启用后,包含工具提示的全部控件将在控件接收键盘焦点后开始显示。随着时间的推移或键盘焦点发生变化时,工具提示能够被解除。用户还能够经过新的键盘快捷键Ctrl + Shift + F10手动关闭工具提示。一旦工具提示被解除,它能够经过相同的键盘快捷方式再次显示。
注意:Ribbon控件上的RibbonToolTips不会显示在键盘焦点上 - 它们只会经过键盘快捷键显示。
Windows 10引入了新的UIAutomation属性SizeOfSet和PositionInSet,应用程序使用它们来描述集合中项目的数量。而后,UIAutomation客户端应用程序(如屏幕阅读器)能够查询应用程序以获取这些属性,并宣布应用程序UI的准确表示。
此功能添加了对WPF应用程序的支持,以将这两个属性公开给UIAutomation。这能够经过两种方式实现:
1.DependencyProperties
新的DependencyProperties SizeOfSet和PositionInSet已添加到System.Windows.Automation.AutomationProperties命名空间。开发人员能够经过XAML设置其值:
2.AutomationPeer虚拟方法
虚拟方法GetSizeOfSetCore和GetPositionInSetCore也已添加到AutomationPeer类中。开发人员能够经过覆盖这些方法为SizeOfSet和PositionInSet提供值:
ItemsControls中的项目将自动为这些属性提供值,而无需开发人员的其余操做。若是ItemsControl已分组,则组的集合将表示为一个集合,每一个组计为一个单独的集合,该组中的每一个项目都提供其在该组内的位置以及该组的大小。虚拟化不会影响自动值。即便一个项目没有实现,它仍然会计入集合的总大小,并影响它的兄弟项目集合中的位置。
仅当开发人员以.NET Framework 4.8为目标或已将AppContext开关设置为“Switch.UseLegacyAccessibilityFeatures.3”(例如经过App.config文件)时,才会提供自动值:
请在.NET Framework 4.8中尝试这些改进,并在下面的评论中或经过GitHub分享您的反馈。
谢谢!