.NET Framework 4.8釋出

Minotauros發表於2019-04-19

原文地址:https://devblogs.microsoft.com/dotnet/announcing-the-net-framework-4-8/

我們很高興地宣佈今天釋出.NET Framework 4.8。它包含在Windows 10 May 2019更新中。.NET Framework 4.8也可在Windows 7+和Windows Server 2008 R2 +上使用。

您可以從我們的 .NET下載站點安裝.NET 4.8 要構建面向.NET Framework 4.8的應用程式,可以下載.NET 4.8開發人員包如果您只想要.NET 4.8執行時,可以嘗試:

.NET Framework 4.8包含更新的工具集以及幾個方面的改進:

  • [執行時]  JIT和NGEN改進
  • [BCL]  更新了ZLib
  • [BCL]  降低FIPS對密碼學的影響
  • [WinForms]  輔助功能增強功能
  • [WCF]  服務行為增強功能
  • [WPF]  高DPI增強,UIAutomation改進

您可以在.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 SP1

 .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服務執行狀況資訊:使用程式碼或使用配置檔案。

  1. 使用程式碼啟用執行狀況端點 
  1. 使用config啟用健康端點

使用HTTP響應程式碼返回服務執行狀況:

可以通過查詢引數(OnServiceFailure,OnDispatcherFailure,OnListenerFailure,OnThrottlePercentExceeded)查詢執行狀況。可以為每個查詢引數指定HTTP響應程式碼(200 - 599)。如果省略查詢引數的HTTP響應程式碼,則預設使用503 HTTP響應程式碼。

查詢引數和示例:

  1. OnServiceFailure
  • 示例:通過查詢https:// contoso:81 / Service1?health&OnServiceFailure = 450,當ServiceHost.State大於CommunicationState.Opened時,將返回450 HTTP響應狀態程式碼。
  1. OnDispatcherFailure
  • 示例:通過查詢https:// contoso:81 / Service1?health&OnDispatcherFailure = 45 5,當任何通道排程程式的狀態大於CommunicationState.Opened時,將返回455 HTTP響應狀態程式碼。
  1. OnListenerFailure
  • 示例:通過查詢https:// contoso:81 / Service1?health&OnListenerFailure = 4 65,當任何通道偵聽器的狀態大於CommunicationState.Opened時,將返回465 HTTP響應狀態程式碼。
  1. 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頁面。

注意:

始終限制對服務執行狀況終結點的訪問是最佳做法。您可以使用以下機制限制訪問:

  1. 為健康端點使用不同於其他服務的埠,並使用防火牆規則來控制訪問。
  2. 將所需的身份驗證和授權新增到執行狀況端點繫結。

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檔案)時,才會提供自動值:

結尾

請在.NET Framework 4.8中嘗試這些改進,並在下面的評論中或通過GitHub分享您的反饋

謝謝!

相關文章