.NET Framework 4.8 發布JIT 和NGEN 改進
.NET Framework 4.8發布了。新版包含在Windows 10 May 2019更新中,.NET Framework 4.8也可在Windows 7+和Windows Server 2008 R2 +上使用。.NET Framework 4.8包含更新的工具集以及幾個方面的改進:
- [運行時] JIT和NGEN改進
- [BCL] 更新了ZLib
- [BCL] 降低FIPS對密碼學的影響
- [WinForms] 輔助功能增強功能
- [WCF] 服務行為增強功能
- [WPF] 高DPI增強,UIAutomation改進
具體說明如下:
.NET Framework 4.8中的新功能運行時- JIT改進
.NET 4.8中的JIT基於.NET Core 2.1。現在,.NET Framework中提供了所有錯誤修復和.NET Core 2.1中許多基於代碼生成的性能優化。
運行時- NGEN的改進
.NET Framework中的NGEN映像不再包含可寫和可執行部分。這減少了可用於通過修改將要執行的內存來執行任意代碼的攻擊的表面區域。
雖然在運行時內存中仍然存在可寫和可執行數據,但此更改會刪除從NGEN映像映射的數據,從而允許它們在不允許圖像中的可執行/可寫部分的受限環境中運行。
運行時- 所有程序集的反惡意軟件掃描
在以前版本的.NET Framework中,Windows Defender或第三方反惡意軟件會自動掃描從磁盤加載的所有程序集以查找惡意軟件。但是,從其他地方加載的程序集(例如使用Assembly.Load(byte []))將不會被掃描,並且可能會檢測到未檢測到的病毒。
Windows 10上的.NET Framework 4.8會觸發Windows Defender和許多其他實現反惡意軟件掃描接口的反惡意軟件解決方案對這些程序集的掃描。我們希望這會使惡意軟件更難以在.NET程序中偽裝自己。
BCL – 更新了ZLib
從.NET Framework 4.5開始,我們使用clrcompression.dll中http://zlib.net的ZLib本機版本(用於數據壓縮的本機外部壓縮庫) ,以便為deflate算法提供實現。在.NET Framework 4.8中,我們將clrcompression.dll更新為使用版本1.2.11,其中包括幾個關鍵的改進和修復。
BCL – 降低FIPS對密碼學的影響
.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”來返回到先前的行為。
Windows窗體- 輔助功能增強功能
在.NET Framework 4.8中,WinForms添加了三個新功能,使開發人員能夠編寫更易於訪問的應用程序。添加的功能旨在使視障用戶的應用程序數據通信更加健壯。當用戶通過鍵盤導航時,我們添加了對ToolTips的支持,我們已將LiveRegions和Notification Events添加到許多常用控件中。
要啟用這些功能,您的應用程序需要在App.config文件中啟用以下AppContextSwitches:
Windows窗體- UIA LiveRegions支持標籤和StatusStrips
UIA Live Regions允許應用程序開發人員通知屏幕閱讀器控件的文本更改,該控件位於用戶工作的位置之外。這將派上用場的示例可以是顯示連接狀態的StatusStrip。如果刪除連接並且狀態發生更改,開發人員可能希望通知屏幕閱讀器此更改。Windows Forms已為Label控件和StatusStrip控件實現了UIA LiveRegions。
在Label控件中使用LiveRegion的示例:
講述者現在將宣布“準備就緒”,無論用戶在何處與應用程序進行交互。您還可以將UserControl實現為Live區域:
Windows窗體- UIA通知事件
在Windows 10 Fall Creators Update中,Windows引入了一種新方法,讓應用程序通知Narrator內容已更改,而Narrator應該宣布更改。UIA通知事件為您的應用程序提供了一種方式來引發UIA事件,這會導致講述人根據您為事件提供的文本簡單地發布通知,而無需在UI中使用相應的控件。在某些情況下,這可能是一種直接提高應用程序可訪問性的方法。有關UIA通知事件的更多信息,請參閱此博客文章。
通知可能派上用場的一個示例是通知可能需要一些時間的某個過程的進度。
提升通知事件的示例:
Windows窗體- 鍵盤訪問的工具提示
目前,只能通過將鼠標指針移動到控件中來觸發控制工具提示。此新功能使鍵盤用戶可以通過使用Tab鍵或帶有或不帶修飾鍵的箭頭鍵來聚焦控件來觸發控件的工具提示。此特定輔助功能增強需要額外的AppContextSwitch,如以下示例所示:
1.創建一個新的WinForms應用程序。
2.將以下XML添加到App.config文件中。
3.將幾個按鈕和一個ToolTip控件添加到應用程序的表單中。
4.設置按鈕的工具提示。
5.運行應用程序並使用鍵盤在按鈕之間導航:
Windows窗體- DataGridView控制可訪問的層次結構更改
目前,可訪問的層次結構(UI自動化樹)將編輯框樹元素顯示為當前編輯的單元格的子元素,但不顯示為DataGridView的根子元素。可以使用Inspect工具觀察層次結構樹更新:
WCF – ServiceHealthBehavior
健康端點具有許多優點,並且編排工具廣泛使用它來根據服務健康狀況管理服務。監控工具還可以使用運行狀況檢查來跟踪和警告服務的可用性和性能,並將其作為早期問題指標。
ServiceHealthBehavior是一種擴展IServiceBehavior的WCF服務行為。添加到ServiceDescription.Behaviors集合後,它將啟用以下內容:
- 使用HTTP響應代碼返回服務運行狀況:可以在查詢字符串中指定HTTP / GET運行狀況探測請求的HTTP狀態代碼。
- 發布服務運行狀況:使用“?運行狀況”查詢字符串,使用HTTP / GET請求顯示服務特定的詳細信息,包括服務狀態和節流計數和容量。在故障排除錯誤行為的WCF服務時,了解並輕鬆訪問所顯示的信息非常重要。
配置ServiceHealthBehavior:
有兩種方法可以公開運行狀況端點並發布WCF服務運行狀況信息:使用代碼或使用配置文件。
- 使用代碼啟用運行狀況端點
- 使用config啟用健康端點
使用HTTP響應代碼返回服務運行狀況:
可以通過查詢參數(OnServiceFailure,OnDispatcherFailure,OnListenerFailure,OnThrottlePercentExceeded)查詢運行狀況。可以為每個查詢參數指定HTTP響應代碼(200 – 599)。如果省略查詢參數的HTTP響應代碼,則默認使用503 HTTP響應代碼。
查詢參數和示例:
- OnServiceFailure:
- 示例:通過查詢https:// contoso:81 / Service1?health&OnServiceFailure = 450,當ServiceHost.State大於CommunicationState.Opened時,將返回450 HTTP響應狀態代碼。
- OnDispatcherFailure:
- 示例:通過查詢https:// contoso:81 / Service1?health&OnDispatcherFailure = 45 5,當任何通道調度程序的狀態大於CommunicationState.Opened時,將返回455 HTTP響應狀態代碼。
- OnListenerFailure:
- 示例:通過查詢https:// contoso:81 / Service1?health&OnListenerFailure = 4 65,當任何通道偵聽器的狀態大於CommunicationState.Opened時,將返回465 HTTP響應狀態代碼。
- OnThrottlePercentExceeded:指定觸發響應的百分比{1 – 100}及其HTTP響應代碼{200 – 599}。
- 示例:通過查詢https:// contoso:81 / Service1?health&OnThrottlePercentExceeded = 70:350,95:500,當節流百分比等於或大於95%時,返回500響應代碼; 當百分比等於或大於70%且小於95%時,返回350; 否則,返回200。
出版服務健康狀況:
啟用運行狀況端點後,可以在html中顯示服務運行狀況(通過指定查詢字符串:https:// contoso:81 / Service1?運行狀況)或xml(通過指定查詢字符串:https:// contoso:81 / Service1?health&Xml)格式。https:// contoso:81 / Service1?health&NoContent返回空的html頁面。
注意:
始終限制對服務運行狀況終結點的訪問是最佳做法。您可以使用以下機制限制訪問:
- 為健康端點使用不同於其他服務的端口,並使用防火牆規則來控制訪問。
- 將所需的身份驗證和授權添加到運行狀況端點綁定。
WPF – 屏幕旁白者不再宣布具有折疊或隱藏可見性的元素
屏幕閱讀器不再宣布具有折疊或隱藏可見性的元素。如果向用戶宣布這些元素,則包含具有折疊或隱藏可見性的元素的用戶界面可能被屏幕閱讀器誤傳。在.NET Framework 4.8中,WPF不再包含UIAutomation樹的Control View中的Collapsed或Hidden元素,因此屏幕閱讀器無法再宣布這些元素。
WPF – SelectionTextBrush屬性,用於非基於Adorner的文本選擇
在.NET Framework 4.7.2中,WPF添加了在不使用adorner層的情況下繪製TextBox和PasswordBox文本選擇的功能(參見此處)。此場景中所選文本的前景色由SystemColors.HighlightTextBrush決定。
在.NET Framework 4.8中,我們添加了一個新屬性SelectionTextBrush,允許開發人員在使用基於非裝飾器的文本選擇時為所選文本選擇特定畫筆。
此屬性僅適用於啟用了基於非裝飾器的文本選擇的WPF應用程序中的TextBoxBase派生控件和PasswordBox。它不適用於RichTextBox。如果未啟用基於非裝飾器的文本選擇,則會忽略此屬性。
要使用此屬性,只需將其添加到XAML代碼並使用適當的畫筆或綁定。
生成的文本選擇如下所示:
您可以結合使用SelectionBrush和SelectionTextBrush來生成您認為合適的背景和前景的任何顏色組合。
WPF – 高DPI增強功能
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類以獲取其他文檔。
WPF – 支持UIAutomation ControllerFor屬性
UIAutomation的ControllerFor屬性返回一個自動化元素數組,這些元素由支持該屬性的自動化元素操作。此屬性通常用於自動建議可訪問性。當自動化元素影響應用程序UI或桌面的一個或多個段時,將使用ControllerFor。否則,很難將控制操作的影響與UI元素相關聯。此功能增加了控件為ControllerFor屬性提供值的功能。
AutomationPeer中添加了一個新的虛擬方法:
要為ControllerFor屬性提供值,只需覆蓋此方法並返回此AutomationPeer操作的控件的AutomationPeers列表:
WPF – 鍵盤訪問的工具提示
當前工具提示僅在用戶將鼠標光標懸停在控件上時顯示。在.NET Framework 4.8中,WPF添加了一項功能,可以使工具提示在鍵盤焦點上顯示,也可以通過鍵盤快捷鍵顯示。
要啟用此功能,應用程序需要通過AppContext開關“Switch.UseLegacyAccessibilityFeatures.3”和“Switch.UseLegacyToolTipDisplay”來定位.NET Framework 4.8或選擇加入。
示例App.config文件:
啟用後,包含工具提示的所有控件將在控件接收鍵盤焦點後開始顯示。隨著時間的推移或鍵盤焦點發生變化時,工具提示可以被解除。用戶還可以通過新的鍵盤快捷鍵Ctrl + Shift + F10手動關閉工具提示。一旦工具提示被解除,它可以通過相同的鍵盤快捷方式再次顯示。
注意:Ribbon控件上的RibbonToolTips不會顯示在鍵盤焦點上- 它們只會通過鍵盤快捷鍵顯示。
WPF – 添加了對SizeOfSet和PositionInSet UIAutomation屬性的支持
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文件)時,才會提供自動值。
支持的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 SP1
下載地址: