共用方式為


.NET Framework 有什麼新內容

注意

.NET Framework 獨立於 Windows 更新提供服務,並修補安全性與可靠性錯誤。 一般而言,安全性更新會每季發行一次。 .NET Framework 將繼續隨 Windows 一同使用,且無移除計畫。 你不需要遷移 .NET Framework 應用程式,但新開發時,使用 .NET 代替 .NET Framework

本文總結以下 .NET 框架版本中的關鍵新功能與改進:

本文不提供有關每個新功能的全面信息,並且可能會發生變化。 關於 .NET 框架的一般資訊,請參見 入門。 如需支援的平台,請參閱 系統需求。 如需下載連結和安裝指示,請參閱 安裝指南

注意

.NET Framework 團隊也透過 NuGet 推出頻外功能,以擴展平台支援並引入新功能,如不可變集合與啟用 SIMD 的向量類型。 欲了解更多資訊,請參閱 附加類別函式庫與 API 以及 .NET 框架與額外版本。 請參閱 .NET Framework 的完整 完整 NuGet 套件清單

介紹 .NET Framework 4.8.1

.NET Framework 4.8.1 在先前版本的 .NET Framework 4.x 基礎上,加入了許多新修正和多項新功能,同時保持非常穩定的產品。

下載並安裝 .NET Framework 4.8.1

你可以從以下地點下載 .NET Framework 4.8.1:

.NET Framework 4.8 可安裝於 Windows 11、Windows 10 版本 21H2、Windows 10 版本 21H1、Windows 10 版本 20H2,以及從 Windows Server 2022 起開始的相應伺服器平台。 你可以使用網頁安裝程式或離線安裝程式來安裝 .NET Framework 4.8.1。 大部分用戶的建議方式是使用 Web 安裝程式。

在 Visual Studio 2022 版本 17.3 或更新版本中,您可以透過安裝 .NET Framework 4.8.1 開發者包 來鎖定 .NET Framework 4.8.1。

.NET Framework 4.8.1 新增了什麼

.NET Framework 4.8.1 在以下領域引入了新功能:

提升無障礙性,讓應用程式能為輔助科技使用者提供適當的體驗,是 .NET Framework 4.8.1 的主要重點之一。 關於 .NET Framework 4.8.1 中的無障礙功能改進資訊,請參閱 .NET Framework 無障礙功能新內容

.NET Framework 4.8.1 為 .NET Framework 家族新增了原生 Arm64 支援。 因此,你在龐大的 .NET Framework 應用程式與函式庫生態系中的投資,現在可以利用在 Arm64 上原生執行工作負載的優勢——也就是相較於在 Arm64 上模擬的 x64 程式碼時,效能更佳。

Microsoft致力於提供可供所有人存取 的產品和平臺。 .NET Framework 4.8.1 提供兩個 Windows UI 開發平台,兩者皆提供開發者建立無障礙應用程式所需的支援。 在過去數次版本中,Windows Forms 與 WPF 都新增了新功能,並修正了許多與無障礙相關的可靠性問題。 你可以造訪 .NET Framework 的無障礙功能新增項目,閱讀每個版本中修正或新增的內容詳情。

在此版本中,Windows Forms 與 WPF 均對工具提示的處理做了改進,使其更易於使用。 在這兩種情況下,工具提示現在都符合 WCAG2.1 內容中暫留或聚焦 指引所述的指導方針。 工具提示的需求如下:

  • 工具提示必須透過滑鼠懸停或鍵盤導航至控制項來顯示。
  • 工具提示應該可關閉。 也就是說,像 Esc 這樣的簡單鍵盤命令應該會關閉工具提示。
  • 工具提示應該能在懸停時顯示。 用戶應該能夠將滑鼠游標放在工具提示上。 這使低視覺使用者能夠使用放大鏡來讀取工具提示。
  • 工具提示應該是持續性的。 工具提示不應在經過一定時間後自動消失。 相反地,用戶應該將滑鼠移至另一個控件上或透過鍵盤命令來關閉工具提示。

在 Windows Forms 中,此支援僅支援 Windows 11 或更新作業系統。 Windows Forms 是一個 Windows API 的輕量管理封裝,而新的工具提示行為僅在 Windows 11 才可用。 WPF 對其易存取工具提示沒有作業系統版本依賴。

WPF 已在 .NET Framework 4.8 中實作了大部分符合 WCAG2.1 標準工具提示的要求。 在此版本中,WPF改進了使用體驗,確保目前視窗中的工具提示可透過使用 Esc鍵、Ctrl鍵(單獨使用),或組合 CtrlShiftF10 輕鬆關閉。 在此版本中,跳出鍵的範圍已縮小,僅適用於目前視窗。 以前它會套用至應用程式中任何開啟的工具提示。

Windows Forms 是第一個為 .NET Framework 開發的 Windows UI 堆疊。 因此,它最初是為了利用舊的輔助功能技術而創建的,該技術不符合當前的輔助功能要求。 在此版本中,Windows Forms 解決了多項問題。 欲了解完整的無障礙相關變更清單,請造訪 .NET Framework 無障礙的新內容

.NET Framework 4.8.1 中 Windows Forms 改進的重點包括:

  • Text 圖樣支援– Windows Forms新增對 UIA 文字圖樣的支援。 此模式可讓輔助技術逐字遍歷 TextBox 或類似的文字控制項的內容。 它可讓控件內的文字被選取和更改,並在游標處插入新的文字。 Windows Forms 新增了對 TextBox、DataGridView 儲存格、ComboBox 控制項等多項功能的支援。

  • 解決對比度問題——在多個控制項中,Windows Forms 將選取矩形的對比度調整為更暗且更明顯。

  • 修正數個 DataGridView 問題:

    • 捲軸名稱已更新為一致。
    • 朗讀程式現在能夠專注於空白的 DataGridView 單元格。
    • 開發人員可以為自訂的 DataGridView 儲存格設置本地化的控制類型屬性。
    • DataGridViewLink 儲存格的連結色彩已更新,以與背景有更好的對比。

介紹 .NET 框架 4.8

.NET Framework 4.8 在先前版本的 .NET Framework 4.x 基礎上,加入了許多新修正與多項新功能,同時保持非常穩定的產品。

下載並安裝 .NET Framework 4.8

你可以從以下地點下載 .NET Framework 4.8:

.NET Framework 4.8 可安裝於 Windows 10、Windows 8.1、Windows 7 SP1,以及從 Windows Server 2008 R2 SP1 起的相應伺服器平台。 你可以使用網頁安裝程式或離線安裝程式來安裝 .NET Framework 4.8。 大部分用戶的建議方式是使用 Web 安裝程式。

您可以透過安裝 .NET Framework 4.8 Developer Pack,將 Visual Studio 2012 或更新版本的目標設置為 .NET Framework 4.8。

.NET Framework 4.8 新增了什麼

.NET Framework 4.8 在以下領域引入了新功能:

提升的無障礙性,讓應用程式能為輔助科技使用者提供適當的體驗,持續是 .NET Framework 4.8 的主要重點。 欲了解 Framework 4.8 .NET無障礙改進資訊,請參見 .NET Framework 無障礙新功能

基類

降低對密碼編譯的 FIPS 影響。 在早期版本的 .NET 框架中,受管理的密碼學提供者類別如 SHA256Managed 在系統密碼函式庫設定為「FIPS 模式」時會拋出 CryptographicException。 這些例外狀況會被拋出,因為受控版本的加密提供者類別與系統加密庫不同,未經過聯邦資訊處理標準(FIPS 140-2)認證。 由於很少有開發人員將他們的開發機器設定為 FIPS 模式,因此通常會在生產系統中投擲例外狀況。

預設情況下,針對 .NET Framework 4.8 的應用程式中,以下受管理密碼類別在此情況下不再拋出 CryptographicException

相反地,這些類別會將密碼編譯作業重新導向至系統密碼編譯程式庫。 此變更有效地消除了開發人員環境和生產環境之間可能令人困惑的差異,並使原生元件和受管理元件在相同的加密策略下運行。 相依於這些例外狀況的應用程式可以將 AppContext 參數 Switch.System.Security.Cryptography.UseLegacyFipsThrow 設定為 true,以還原先前的行為。 如需詳細資訊,請參閱 在 FIPS 模式中,受控密碼編譯類別不會擲回 CryptographyException

使用更新版本的 ZLib

從 .NET Framework 4.5 開始,clrcompression.dll assembly 使用 ZLib,一個原生的外部函式庫用於資料壓縮,以提供 deflate 演算法的實作。 .NET Framework 4.8 版本的 clrcompression.dll 更新為使用 ZLib 1.2.11 版本,其中包含多項關鍵改進與修正。

Windows Communication Foundation(WCF)

「ServiceHealthBehavior」簡介

協作工具廣泛使用健康端點,可依健康狀態管理服務。 監控工具也可以使用健康檢查來追蹤和提供有關服務可用性和效能的通知。

ServiceHealthBehavior 是擴充 IServiceBehavior的 WCF 服務行為。 新增至 ServiceDescription.Behaviors 集合時,服務行為會執行下列動作:

  • 傳回服務健康狀態及其對應的 HTTP 回應碼。 您可以在查詢字串中指定 HTTP/GET 健康情況探查要求的 HTTP 狀態碼。

  • 發佈服務健康情況的相關資訊。 服務特定的詳細信息,包括服務狀態、頻率限制計數和容量,可以透過 HTTP/GET 請求配合 ?health 查詢字串來顯示。 對 WCF 服務進行疑難解答時,輕鬆存取這類資訊非常重要。

有兩種方式可以公開健康情況端點並發佈 WCF 服務健康情況資訊:

  • 透過代碼。 例如:

    ServiceHost host = new ServiceHost(typeof(Service1),
                       new Uri("http://contoso:81/Service1"));
    ServiceHealthBehavior healthBehavior =
        host.Description.Behaviors.Find<ServiceHealthBehavior>();
    healthBehavior ??= new ServiceHealthBehavior();
    host.Description.Behaviors.Add(healthBehavior);
    
    Dim host As New ServiceHost(GetType(Service1),
                New Uri("http://contoso:81/Service1"))
    Dim healthBehavior As ServiceHealthBehavior =
       host.Description.Behaviors.Find(Of ServiceHealthBehavior)()
    If healthBehavior Is Nothing Then
       healthBehavior = New ServiceHealthBehavior()
    End If
    host.Description.Behaviors.Add(healthBehavior)
    
  • 使用組態檔。 例如:

    <behaviors>
      <serviceBehaviors>
        <behavior name="DefaultBehavior">
          <serviceHealth httpsGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    

可以使用查詢參數(例如 OnServiceFailureOnDispatcherFailureOnListenerFailureOnThrottlePercentExceeded)來查詢服務的健康狀態,並且可以為每個查詢參數指定HTTP回應代碼。 如果省略查詢參數的 HTTP 回應碼,則預設會使用 503 HTTP 回應碼。 例如:

查詢參數和範例:

  • OnDispatcherFailure: https://contoso:81/Service1?health&OnDispatcherFailure=455

    當任何通道分派器的狀態大於 CommunicationState.Opened時,會傳回 455 HTTP 回應狀態碼。

  • OnListenerFailure: https://contoso:81/Service1?health&OnListenerFailure=465

    當任何通道接聽器的狀態大於 CommunicationState.Opened時,會傳回 465 HTTP 回應狀態碼。

  • OnThrottlePercentExceeded: https://contoso:81/Service1?health&OnThrottlePercentExceeded= 70:350,95:500

    指定觸發回應的百分比 {1 – 100} 及其 HTTP 回應代碼 {200 – 599}。 在這個例子中:

    • 如果百分比大於 95,則會傳回 500 HTTP 回應碼。

    • 如果百分比介於 70 到 95 之間,則會傳回 350。

    • 否則會傳回 200。

服務健康情況狀態可以透過指定查詢字串(例如 )以 HTML 顯示,也可以透過指定查詢字串(例如 https://contoso:81/Service1?healthhttps://contoso:81/Service1?health&Xml)以 XML 顯示。 類似的 https://contoso:81/Service1?health&NoContent 查詢字串會傳回空白的 HTML 頁面。

Windows Presentation Foundation(WPF)

高 DPI 增強功能

在 .NET Framework 4.8 中,WPF 新增了對 Per-Monitor V2 DPI 感知及 Mixed-Mode DPI 縮放的支援。 更多關於高 DPI 開發的資訊,請參閱 Windows 上的 High DPI 桌面應用程式開發

.NET Framework 4.8 改善了在支援Mixed-Mode DPI縮放的平台上,對託管HWND的支援,以及在高DPI WPF應用程式中與Windows Forms的互操作性(自Windows 10 2018年4月更新開始)。 當 HWND 或 Windows Forms 控制項透過呼叫 SetThreadDpiHostingBehaviorSetThreadDpiAwarenessContext 被建立為 Mixed-Mode DPI 縮放視窗時,它們可以在 Per-Monitor V2 的 WPF 應用程式中託管,並會適當調整大小和縮放比例。 這類託管內容不會以原始 DPI 顯示,而是操作系統會將託管內容調整為適當的大小。 支援 Per-Monitor v2 DPI 感知模式也允許 WPF 控制項可以被託管(即作為父)在高 DPI 應用程式的原生視窗中。

若要啟用 Mixed-Mode 高 DPI 縮放比例的支援,您可以設定下列 AppContext 切換應用程式組態檔:

<runtime>
   <AppContextSwitchOverrides value = "Switch.System.Windows.DoNotScaleForDpiChanges=false; Switch.System.Windows.DoNotUsePresentationDpiCapabilityTier2OrGreater=false"/>
</runtime>

通用語言執行環境

.NET Framework 4.8 的執行環境包含以下變更與改進:

JIT 編譯器的改善。 .NET Framework 4.8 中的即時(JIT)編譯器基於 .NET Core 2.1 中的 JIT 編譯器。 許多對 .NET Core 2.1 JIT 編譯器的優化與所有錯誤修正都包含在 .NET Framework 4.8 JIT 編譯器中。

NGEN 改善。 運行時間已改善對 (NGEN)原生映像生成器映像的記憶體管理,從而使映像對應的數據不再駐留在記憶體中。 這樣可減少攻擊面,降低透過修改將要執行的記憶體來執行任意代碼的攻擊風險。

反惡意代碼掃描所有元件。 在先前版本的 .NET Framework 中,執行時會掃描所有從磁碟載入的組件,使用Windows Defender或第三方反惡意軟體。 不過,像是透過 Assembly.Load(Byte[]) 方法從其他來源載入的元件,不會被掃描,可能含有未被偵測的惡意軟體。 從 Windows 10 上運行的 .NET Framework 4.8 開始,執行時會由實作 Antimalware 掃描介面(AMSI) 的反惡意軟體解決方案來觸發掃描。

.NET Framework 4.7.2 新增了什麼

.NET Framework 4.7.2 在以下領域新增了新功能:

.NET Framework 4.7.2 持續強調提升無障礙性,讓應用程式能為輔助科技使用者提供適當的體驗。 關於.NET Framework 4.7.2 中無障礙改進的資訊,請參見 .NET Framework 無障礙的新內容

基類

.NET Framework 4.7.2 具備大量加密增強功能、更佳的 ZIP 壓縮檔案解壓支援,以及額外的集合 API。

RSA.Create 和 DSA.Create 的新重載方法

DSA.Create(DSAParameters)RSA.Create(RSAParameters) 方法可讓您在建立新的 DSARSA 索引鍵時提供關鍵參數。 它們允許您替換代碼,如下所示:

// Before .NET Framework 4.7.2
using (RSA rsa = RSA.Create())
{
   rsa.ImportParameters(rsaParameters);
   // Other code to execute using the RSA instance.
}
' Before .NET Framework 4.7.2
Using rsa = RSA.Create()
   rsa.ImportParameters(rsaParameters)
   ' Other code to execute using the rsa instance.
End Using

類似以下代碼:

// Starting with .NET Framework 4.7.2
using (RSA rsa = RSA.Create(rsaParameters))
{
   // Other code to execute using the rsa instance.
}
' Starting with .NET Framework 4.7.2
Using rsa = RSA.Create(rsaParameters)
   ' Other code to execute using the rsa instance.
End Using

DSA.Create(Int32)RSA.Create(Int32) 方法可讓您產生具有特定金鑰大小的新 DSARSA 金鑰。 例如:

using (DSA dsa = DSA.Create(2048))
{
   // Other code to execute using the dsa instance.
}
Using dsa = DSA.Create(2048)
   ' Other code to execute using the dsa instance.
End Using

Rfc2898DeriveBytes 建構函式接受哈希演算法名稱

Rfc2898DeriveBytes 類別具有三個新的建構函式,其參數 HashAlgorithmName 可識別派生索引鍵時要使用的 HMAC 演算法。 開發人員不應使用 SHA-1,而是使用 SHA-2 型 HMAC,例如 SHA-256,如下列範例所示:

private static byte[] DeriveKey(string password, out int iterations, out byte[] salt,
                                out HashAlgorithmName algorithm)
{
   iterations = 100000;
   algorithm = HashAlgorithmName.SHA256;

   const int SaltSize = 32;
   const int DerivedValueSize = 32;

   using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, SaltSize,
                                                             iterations, algorithm))
   {
      salt = pbkdf2.Salt;
      return pbkdf2.GetBytes(DerivedValueSize);
   }
}
Private Shared Function DeriveKey(password As String, ByRef iterations As Integer,
                                  ByRef salt AS Byte(), ByRef algorithm As HashAlgorithmName) As Byte()
   iterations = 100000
   algorithm = HashAlgorithmName.SHA256

   Const SaltSize As Integer = 32
   Const  DerivedValueSize As Integer = 32

   Using pbkdf2 = New Rfc2898DeriveBytes(password, SaltSize, iterations, algorithm)
      salt = pbkdf2.Salt
      Return pbkdf2.GetBytes(DerivedValueSize)
   End Using
End Function

暫時金鑰的支援

PFX 匯入可以選擇直接從記憶體載入私鑰,繞過硬碟。 如果在 X509KeyStorageFlags.EphemeralKeySet 建構函式或 X509Certificate2 方法的多載版本中指定新的 X509Certificate2.Import 旗標,則私鑰將會載入為暫時密鑰。 這可以防止按鍵在磁盤上可見。 但:

  • 由於金鑰不會保存到磁碟,因此使用此旗標載入的憑證不適合新增至 X509Store。

  • 以這種方式載入的按鍵幾乎總是透過 Windows CNG 載入。 因此,呼叫端必須藉由呼叫擴充方法來存取私鑰,例如 憑證.GetRSAPrivateKey()。 該 X509Certificate2.PrivateKey 屬性無法運作。

  • 由於舊版 X509Certificate2.PrivateKey 屬性不適用於憑證,因此開發人員應該在切換至暫時金鑰之前執行嚴格的測試。

以程式自動化方式建立 PKCS#10 憑證簽署要求和 X.509 公鑰憑證

從 .NET Framework 4.7.2 開始,工作負載可以產生憑證簽署請求(CSR),允許憑證請求的產生分階段進入現有工具中。 這在測試案例中經常很有用。

欲了解更多資訊與程式碼範例,請參閱 .NET 部落格 中的「PKCS#10 認證簽署請求與 X.509 公鑰憑證的程式化建立」。

新的 SignerInfo 成員

從 .NET Framework 4.7.2 開始,該 SignerInfo 類別會揭露更多關於簽名的資訊。 您可以擷取 System.Security.Cryptography.Pkcs.SignerInfo.SignatureAlgorithm 屬性的值,以判斷簽署者使用的簽章演算法。 SignerInfo.GetSignature 可以呼叫來取得此簽署者的加密簽章副本。

在處置 CryptoStream 之後將封裝數據流保持開啟狀態

從 Framework 4.7.2 .NET開始,CryptoStream 類別新增了一個建構子,允許 Dispose 不關閉包裹的串流。 若要在處置 CryptoStream 實例之後讓包裝數據流保持開啟,請呼叫新的 CryptoStream 建構函式,如下所示:

var cStream = new CryptoStream(stream, transform, mode, leaveOpen: true);
Dim cStream = New CryptoStream(stream, transform, mode, leaveOpen:=true)

DeflateStream 中的 解壓縮變更

自 .NET Framework 4.7.2 起,DeflateStream 類別的解壓縮操作已預設使用原生 Windows API。 通常,這會導致效能大幅提升。

針對 .NET Framework 4.7.2 的應用程式預設啟用使用 Windows API 進行解壓縮的支援。 針對目標為較早版本但在 .NET Framework 4.7.2 上運行的應用程式,可以在應用程式設定檔中新增以下 AppContext switch來啟用此行為:

<AppContextSwitchOverrides value="Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression=false" />

其他集合 API

.NET Framework 4.7.2 新增了多項 API,並加入了 SortedSet<T>HashSet<T> 類型。 這些包括:

ConcurrentDictionary<TKey,TValue> 類別包含新多載的 AddOrUpdateGetOrAdd 方法,以便從字典中擷取值或在找不到時新增,並將值新增至字典或在已存在時更新。

public TValue AddOrUpdate<TArg>(TKey key, Func<TKey, TArg, TValue> addValueFactory, Func<TKey, TValue, TArg, TValue> updateValueFactory, TArg factoryArgument)

public TValue GetOrAdd<TArg>(TKey key, Func<TKey, TArg, TValue> valueFactory, TArg factoryArgument)
Public AddOrUpdate(Of TArg)(key As TKey, addValueFactory As Func(Of TKey, TArg, TValue), updateValueFactory As Func(Of TKey, TValue, TArg, TValue), factoryArgument As TArg) As TValue

Public GetOrAdd(Of TArg)(key As TKey, valueFactory As Func(Of TKey, TArg, TValue), factoryArgument As TArg) As TValue

ASP.NET

支援 Web Forms 中的相依性插入

相依性注入(DI) 將物件與其相依性解耦,這樣一來,物件的程式碼就不必因為相依性的改變而需要修改。 在開發針對 .NET Framework 4.7.2 的 ASP.NET 應用程式時,您可以:

  • 在 ASP.NET 網頁應用程式專案的 handlers and modulesPage instances,以及 user controls 中,使用基於設定器、介面及建構子的注入。

  • 在 ASP.NET 網站專案的 handlers and modulesPage instances,以及 user Controls 中使用基於設定器及介面的注入。

  • 插入不同的相依性插入架構。

支援同一網站 Cookie

SameSite 防止瀏覽器在跨網站請求時傳送 Cookie。 .NET Framework 4.7.2 新增了一個 HttpCookie.SameSite 屬性,其值為 System.Web.SameSiteMode 枚舉成員。 若其值為 SameSiteMode.StrictSameSiteMode.Lax,ASP.NET 會在 set-cookie 標頭上加入 SameSite 屬性。 SameSite 支援適用於 HttpCookie 物件以及 FormsAuthenticationSystem.Web.SessionState Cookie。

您可以為HttpCookie 對象設定 SameSite,如下所示:

var c = new HttpCookie("secureCookie", "same origin");
c.SameSite = SameSiteMode.Lax;
Dim c As New HttpCookie("secureCookie", "same origin")
c.SameSite = SameSiteMode.Lax

您也可以修改 web.config 檔案,在應用程式層級設定 SameSite Cookie:

<system.web>
   <httpCookies sameSite="Strict" />
</system.web>

您可以透過修改網頁組態檔,為 FormsAuthenticationSystem.Web.SessionState Cookie 新增 SameSite 屬性。

<system.web>
   <authentication mode="Forms">
      <forms cookieSameSite="Lax">
         <!-- ...   -->
      </forms>
   </authentication>
   <sessionState cookieSameSite="Lax"></sessionState>
</system.web>

網路

HttpClientHandler 屬性的實作

.NET Framework 4.7.1 為 System.Net.Http.HttpClientHandler 類別新增了八個屬性。 不過有兩個人投擲了PlatformNotSupportedException。 .NET Framework 4.7.2 現在提供了這些屬性的實作。 屬性包括:

SQLClient

支援Azure Active Directory普遍認證與多重驗證

不斷增長的合規性和安全性需求要求許多客戶使用多重要素驗證 (MFA)。 此外,目前的最佳做法不建議直接在連接字串中包含使用者密碼。 為支援這些變更,.NET Framework 4.7.2 擴充了 SQLClient 連線字串,新增「Active Directory Interactive」作為現有「Authentication」關鍵字,以支援多重驗證(MFA)及 Azure AD 認證。 這種新的互動方式支援原生及聯邦的 Azure AD 使用者,以及 Azure AD 訪客使用者。 使用此方法時,Azure AD 強制執行的多重驗證(MFA)認證可支援 SQL 資料庫。 此外,驗證程序會要求使用者密碼,以遵守安全性最佳實務。

在早期版本的 .NET 框架中,SQL 連線僅支援 SqlAuthenticationMethod.ActiveDirectoryPasswordSqlAuthenticationMethod.ActiveDirectoryIntegrated 選項。 這兩者都是非互動式 ADAL 通訊協定的一部分,不支援 MFA。 透過新的 SqlAuthenticationMethod.ActiveDirectoryInteractive 選項,SQL 連線支援多重驗證(MFA)以及現有的驗證方法(密碼與整合認證),讓使用者能互動式輸入使用者密碼,而不會在connection string中持續保留密碼。

欲了解更多資訊及範例,請參閱 .NET 部落格中的「SQL -- Azure AD Universal and Multifactor Authentication Support」。

Always Encrypted 第 2 版 的支援

NET Framework 4.7.2 新增支援以安全區域為基礎的 Always Encrypted。 Always Encrypted 的原始版本是一種用戶端加密技術,其中加密金鑰永遠不會離開用戶端。 在基於 enclave 的 Always Encrypted 功能中,客戶端可選擇將加密金鑰傳送至安全 enclave。此安全 enclave 是一個安全的計算實體,可視為 SQL Server 的一部分,但 SQL Server 的程式碼無法加以干擾。 為了支援基於 enclave 的 Always Encrypted,.NET Framework 4.7.2 在 System.Data.SqlClient 命名空間中新增以下類型與成員:

然後,應用程式組態檔會指定抽象類別 System.Data.SqlClient.SqlColumnEncryptionEnclaveProvider 的具體實作,以提供安全區提供者的功能。 例如:

<configuration>
  <configSections>
    <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection,System.Data,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
  </configSections>
  <SqlColumnEncryptionEnclaveProviders>
    <providers>
      <add name="Azure" type="Microsoft.SqlServer.Management.AlwaysEncrypted.AzureEnclaveProvider,MyApp"/>
      <add name="HGS" type="Microsoft.SqlServer.Management.AlwaysEncrypted.HGSEnclaveProvider,MyApp" />
    </providers>
  </SqlColumnEncryptionEnclaveProviders >
</configuration>

記憶體保護區型 Always Encrypted 的基本流程如下:

  1. 使用者建立一個 Always Encrypted 連接至 SQL Server,支持 enclave 基礎的 Always Encrypted。 驅動程式會連絡證明服務,以確保它連線到正確的安全區域。

  2. 一旦隔區被認證,驅動程式會與託管在 SQL Server 上的安全隔區建立安全通道。

  3. 在 SQL 連線期間,驅動程式與安全區域共用由用戶端授權的加密密鑰。

Windows Presentation Foundation

尋找 ResourceDictionaries 依來源

從 .NET Framework 4.7.2 開始,診斷助理可以定位由特定來源 Uri 建立的 ResourceDictionaries。 (此功能僅供診斷助理使用,非生產應用。)像 Visual Studio 的「編輯後繼續」這類診斷助理,讓使用者能編輯 ResourceDictionary,並打算將變更套用到執行中的應用程式上。 達成此目標的其中一個步驟是找到執行中的應用程式所建立的所有資源字典,這些字典是從正在編輯的字典中創建的。 例如,應用程式可以宣告 ResourceDictionary,其內容是從指定的來源 URI 複製:

<ResourceDictionary Source="MyRD.xaml" />

MyRD.xaml 中編輯原始標記語法的診斷助手,可以使用新功能來定位字典。 此功能是由新的靜態方法 ResourceDictionaryDiagnostics.GetResourceDictionariesForSource實作。 診斷助理會使用識別原始標記的絕對 Uri 來呼叫新方法,如下列程式碼所示:

IEnumerable<ResourceDictionary> dictionaries = ResourceDictionaryDiagnostics.GetResourceDictionariesForSource(new Uri("pack://application:,,,/MyApp;component/MyRD.xaml"));
Dim dictionaries As IEnumerable(Of ResourceDictionary) = ResourceDictionaryDiagnostics.GetResourceDictionariesForSource(New Uri("pack://application:,,,/MyApp;component/MyRD.xaml"))

除非已啟用 VisualDiagnostics 且已設定 ENABLE_XAML_DIAGNOSTICS_SOURCE_INFO 環境變數,否則方法會傳回空集合。

尋找 ResourceDictionary 擁有者

從 .NET Framework 4.7.2 開始,診斷助理可以定位特定 ResourceDictionary 的擁有者。 (此功能供診斷助理使用,非生產應用。)每當對 ResourceDictionary 進行變更時,WPF 會自動找到所有可能受到該變更影響的 DynamicResource 參考。

像 Visual Studio 的「編輯與繼續」這類診斷助理,可能會想擴展此功能以處理 StaticResource 參考。 在此過程中的第一個步驟是找到字典的擁有者,也就是說,尋找所有 Resources 屬性直接或間接透過 ResourceDictionary.MergedDictionaries 屬性參考字典的物件。 在 System.Windows.Diagnostics.ResourceDictionaryDiagnostics 類別上實作了三個新的靜態方法,分別對應具有 Resources 屬性的基底類型,支援此步驟:

除非已啟用 VisualDiagnostics 且已設定 ENABLE_XAML_DIAGNOSTICS_SOURCE_INFO 環境變數,否則這些方法會傳回空的可列舉。

尋找 StaticResource 參考

診斷助手每當解析 StaticResource 參考時,將會收到通知。 (此功能僅供診斷助理使用,非生產應用。)像 Visual Studio 的「編輯與繼續」功能這類診斷助理,可能會想在資源在 ResourceDictionary 值變動時更新所有使用情況。 WPF 會自動為 DynamicResource 參考執行此操作,但對於 StaticResource 參考則刻意不執行。 從 .NET Framework 4.7.2 開始,診斷助理可以利用這些通知來定位靜態資源的使用情況。

新的 ResourceDictionaryDiagnostics.StaticResourceResolved 事件會實作通知:

public static event EventHandler<StaticResourceResolvedEventArgs> StaticResourceResolved;
Public Shared Event StaticResourceResolved As EventHandler(Of StaticResourceResolvedEventArgs)

每當執行階段解析 StaticResource 參考時,就會引發此事件。  StaticResourceResolvedEventArgs 自變數會描述解析,並指出裝載 StaticResource 參考的物件和屬性,以及用於解析的 ResourceDictionary 和索引鍵:

public class StaticResourceResolvedEventArgs : EventArgs
{
   public Object TargetObject { get; }

   public Object TargetProperty { get; }

   public ResourceDictionary ResourceDictionary { get; }

   public object ResourceKey { get; }
}
Public Class StaticResourceResolvedEventArgs : Inherits EventArgs
   Public ReadOnly Property TargetObject As Object
   Public ReadOnly Property TargetProperty As Object
   Public ReadOnly Property ResourceDictionary As ResourceDictionary
   Public ReadOnly Property ResourceKey As Object
End Class

除非啟用了add並設定了VisualDiagnostics環境變數,否則不會引發事件(而其ENABLE_XAML_DIAGNOSTICS_SOURCE_INFO存取子將被忽略)。

ClickOnce

支援 HDPI 的應用程式,適用於 Windows Forms、Windows Presentation Foundation(WPF)及 Visual Studio Tools for Office(VSTO),皆可透過 ClickOnce 部署。 若在應用程式清單中發現以下條目,則在 .NET Framework 4.7.2 下部署將成功:

<windowsSettings>
   <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>

對於 Windows Forms 應用程式,先前在應用程式設定檔設定 DPI 意識而非應用程式清單中設定的替代方案,已不再是 ClickOnce 部署成功的關鍵。

.NET Framework 4.7.1 的新內容

.NET Framework 4.7.1 在以下領域新增了新功能:

此外,.NET Framework 4.7.1 的一大重點是提升無障礙性,讓應用程式能為輔助科技使用者提供適當的體驗。 關於 .NET Framework 4.7.1 中無障礙改進的資訊,請參見 Framework .NET 無障礙的新進展。

基類

對 .NET 標準 2.0

.NET標準定義了一組必須在每個支援該標準版本的.NET實作中可用的API。 .NET Framework 4.7.1 完全支援 .NET Standard 2.0,並新增了約 200 個 API,這些 API 是在 .NET Standard 2.0 中定義而在 .NET Framework 4.6.1、4.6.2 和 4.7 中缺少的。 (請注意,這些版本的 .NET Framework 僅在目標系統上部署了額外的 .NET Standard 支援檔案時,才支援 .NET Standard 2.0。)欲了解更多資訊,請參閱 .NET Framework 4.7.1 執行時與編譯器功能部落格文章中的「BCL - .NET Standard 2.0 支援」。

支援組態建置器

配置建構器允許開發者在執行時動態注入並建構應用程式的設定設定。 自訂組態產生器可用來修改組態區段中的現有資料,或完全從頭開始建置組態區段。 如果沒有配置建置器,.config 檔案是靜態的,且其設定會在啟動應用程式之前定義一段時間。

若要建立自訂配置建置器,您可以從抽象 ConfigurationBuilder 類別衍生建置器,並置換其 ConfigurationBuilder.ProcessConfigurationSectionConfigurationBuilder.ProcessRawXml。 您也可以在 .config 檔案中定義建置器。 欲了解更多資訊,請參閱 .NET Framework 4.7.1 ASP.NET 與 Configuration Features部落格文章中的「Configuration Builders」部分。

執行時功能偵測

System.Runtime.CompilerServices.RuntimeFeature 類別提供了判斷某個預設功能在編譯時或執行時是否支援某.NET實作的機制。 在編譯階段,編譯器可以檢查指定欄位是否存在,以判斷是否支援該特性;如果是這樣,它可以發出利用該功能的程式碼。 執行時,應用程式可以在執行時先呼叫該 RuntimeFeature.IsSupported 方法,再輸出程式碼。 如需詳細資訊,請參閱 新增輔助方法來描述運行時間支援的功能

值元組類型是可序列化的

從 Framework 4.7.1 .NET開始,System.ValueTuple 及其相關的泛型類型被標記為 Serializable,允許二進位序列化。 這應該會使像 Tuple<T1,T2,T3>Tuple<T1,T2,T3,T4>這些 Tuple 類型更容易移轉為值元組類型。 欲了解更多資訊,請參閱 .NET Framework 4.7.1 執行與編譯器功能部落格文章中的「編譯器 -- ValueTuple 可序列化」。

唯讀參考的支援

.NET Framework 4.7.1 新增了 System.Runtime.CompilerServices.IsReadOnlyAttribute。 語言編譯器會使用此屬性來標示具有唯讀 ref 傳回類型或參數的成員。 欲了解更多資訊,請參閱 .NET Framework 4.7.1 執行時與編譯器功能部落格文章中的「編譯器 -- 僅讀取參考的支援」。 關於參考回傳值的資訊,請參見 Ref 回傳值 以及 ref locals 以及 Ref 回傳值 (Visual Basic)

共通語言執行階段(Common Language Runtime,CLR)

垃圾收集效能改善

.NET Framework 4.7.1 中對垃圾回收(GC)的變更提升了整體效能,特別是在大型物件堆積(LOH)配置方面。 在 .NET Framework 4.7.1 中,小物件堆(SOH)與 LOH 分配分別使用鎖,允許在背景 GC 掃描 SOH 時進行 LOH 配置。 因此,大量進行 LOH 配置的應用程式應該會減少配置鎖定衝突,從而提升效能。 欲了解更多資訊,請參閱 .NET Framework 4.7.1 執行時與編譯器功能部落格文章中的「執行環境 -- GC 效能改進」章節。

網路

SHA-2 支援用於 Message.HashAlgorithm

在 .NET Framework 4.7 及更早版本中,Message.HashAlgorithm 屬性僅支援 HashAlgorithm.Md5HashAlgorithm.Sha 的值。 從 .NET Framework 4.7.1 開始,也支援 HashAlgorithm.Sha256HashAlgorithm.Sha384 以及 HashAlgorithm.Sha512。 是否實際使用此值取決於 MSMQ,因為 Message 實例本身不會進行雜湊,而只是將值傳遞至 MSMQ。 欲了解更多資訊,請參閱.NET框架4.7.1 ASP.NET 與配置功能部落格文章中的「SHA-2 對 Message.HashAlgorithm 的支援」章節。

ASP.NET

ASP.NET 應用程式中的執行步驟

ASP.NET 在包含 23 個事件的預定義管線中處理請求。 ASP.NET 會將每個事件處理程式作為執行步驟執行。 在 ASP.NET 版本到 .NET Framework 4.7 中,ASP.NET 無法流出執行上下文,因為在原生執行緒與受管理執行緒間切換。 相反,ASP.NET 僅有選擇性地傳遞HttpContext。 從 Framework 4.7.1 .NET開始,HttpApplication.OnExecuteRequestStep(Action<HttpContextBase,Action>) 方法也允許模組還原環境資料。 這項功能針對對追蹤、分析、診斷或交易等應用程式執行流程感興趣的程式庫設計。 欲了解更多資訊,請參閱 .NET Framework 4.7.1 ASP.NET 與設定功能部落格文章中的「ASP.NET 執行步驟功能」。

ASP.NET HttpCookie 解析

.NET Framework 4.7.1 包含一種新方法HttpCookie.TryParse,提供一種標準化方式,從字串建立 HttpCookie 物件,並準確指派 cookie 值,如到期日與路徑。 欲了解更多資訊,請參閱.NET框架4.7.1 ASP.NET 與配置功能部落格文章中的「ASP.NET HttpCookie 解析」。

SHA-2 雜湊選項用於 ASP.NET 表單認證憑證

在 .NET Framework 4.7 及更早版本中,ASP.NET 允許開發者使用 MD5 或 SHA1 將帶有雜湊密碼的使用者憑證儲存在設定檔中。 從 .NET Framework 4.7.1 開始,ASP.NET 也支援新的安全 SHA-2 雜湊選項,如 SHA256、SHA384 和 SHA512。 SHA1 仍為預設值,且可在 Web 設定檔中定義非預設雜湊演算法。

重要

Microsoft 建議您使用最安全的可用驗證流程。 如果你要連接到 Azure SQL,推薦的認證方式是 Managed Identities for Azure resources

.NET Framework 4.7 新增了什麼

.NET Framework 4.7 在以下領域新增了新功能:

關於新增 Framework 4.7 .NET API 清單,請參見 GitHub 上的 .NET Framework 4.7 API Changes。 關於 .NET Framework 4.7 的功能改進與錯誤修正清單,請參見 .NET Framework 4.7 變更列表 GitHub。 欲了解更多資訊,請參閱.NET部落格的 Announcing .NET Framework 4.7

基類

.NET Framework 4.7 透過 DataContractJsonSerializer 來改進序列化:

增強功能使用橢圓曲線密碼編譯(ECC)*

在 Framework 4.7 .NET中,ImportParameters(ECParameters) 方法被加入到 ECDsaECDiffieHellman 類別中,讓物件能代表已建立的鍵。 新增了一種 ExportParameters(Boolean) 方法,以使用明確的曲線參數匯出金鑰。

.NET Framework 4.7 也新增對額外曲線的支援(包括 Brainpool 曲線套件),並透過新的 CreateCreate 工廠方法預先定義以簡化建立。

你可以在GitHub上看到 .NET Framework 4.7 密碼學改進的範例

DataContractJsonSerializer 對控制字元的支援更好

在 .NET Framework 4.7 中,DataContractJsonSerializer 類別依照 ECMAScript 6 標準序列化控制字元。 針對 .NET Framework 4.7 的應用程式,此行為為預設啟用;而針對在 .NET Framework 4.7 上執行但目標為較舊版本 .NET Framework 的應用程式,則為選擇性功能。 如需詳細資訊,請參閱 應用程式相容性 一節。

網路

.NET Framework 4.7 新增以下與網路相關的功能:

TLS 通訊協定的預設作業系統支援*

TLS 堆疊由 System.Net.Security.SslStream 以及 HTTP、FTP 和 SMTP 等上層元件使用,可讓開發人員使用作業系統支援的預設 TLS 通訊協定。 開發人員不再需要硬式編碼 TLS 版本。

ASP.NET

在 .NET Framework 4.7 中,ASP.NET 包含以下新功能:

物件快取擴充性

從 .NET Framework 4.7 開始,ASP.NET 新增了一套 API,讓開發者能夠取代預設的 ASP.NET 實作,用於記憶體內物件快取與記憶體監控。 若 ASP.NET 實作不足,開發者現在可替換以下三個元件中的任一:

  • 物件快取存放區。 透過使用新的快取提供者設定區段,開發者可以透過新的 ICacheStoreProvider 介面,插入 ASP.NET 應用程式的新物件快取實作。

  • 記憶體監視。 ASP.NET 中的預設記憶體監控器會在應用程式接近設定的私有位元組限制時通知應用程式,或當機器的總可用實體記憶體不足時。 當這些限制範圍達到時,會引發通知。 對於某些應用程式,通知是在接近設定的限制時觸發的,這樣的設置不利於用戶進行有效反應。 開發人員現在可以使用 ApplicationMonitors.MemoryMonitor 屬性撰寫自己的記憶體監視器來取代預設的。

  • 記憶體限制反應。 預設情況下,ASP.NET 嘗試修剪物件快取,並在接近私有位元組程序限制時定期呼叫 GC.Collect。 對於某些應用程式,呼叫 GC.Collect 的頻率或修剪的快取數量沒有效率。 開發者現在可以透過將 IObserver 實作訂閱到應用程式的記憶體監控器,來取代或補充預設行為。

Windows Communication Foundation(WCF)

Windows Communication Foundation(WCF)新增了以下功能與變更:

能夠將預設訊息安全性設定設定為 TLS 1.1 或 TLS 1.2

從 .NET Framework 4.7 開始,WCF 允許您將 TLS 1.1 或 TLS 1.2 以及 SSL 3.0 和 TLS 1.0 配置為預設的訊息安全協定。 這是選擇性設定;若要啟用,您必須將下列專案新增至您的應用程式設定檔:

<runtime>
   <AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols=false;Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
</runtime>

提升 WCF 應用程式的可靠性及 WCF 串行化的可靠性

WCF 包含許多程式碼變更,可消除競爭條件,進而改善序列化選項的效能和可靠性。 這些包括:

  • 更好地在呼叫SocketConnection.BeginReadSocketConnection.Read時,支援混合非同步和同步程式碼。
  • 在中 SharedConnectionListener 止與 DuplexChannelBinder 連線時提升了可靠性。
  • 改善呼叫 FormatterServices.GetSerializableMembers(Type) 方法時序列化作業的可靠性。
  • 藉由呼叫 ChannelSynchronizer.RemoveWaiter 方法,改善移除等候者時的可靠性。

Windows Forms

在 .NET Framework 4.7 中,Windows Forms 改善了對高 DPI 螢幕的支援。

高解析度支援

從針對 .NET Framework 4.7 的應用程式開始,.NET Framework 支援高 DPI 與動態 DPI 支援 Windows Forms 應用程式。 高 DPI 支援可改善高 DPI 監視器上表單和控制項的版面配置和外觀。 當使用者變更執行中應用程式的 DPI 或顯示縮放比例時,動態 DPI 會變更表單和控制項的版面配置和外觀。

高 DPI 支援是一項需要選擇加入的功能,透過在你的應用程式設定檔中定義 <System.Windows.Forms.ConfigurationSection> 區段來設定。 欲了解更多如何在Windows Forms應用程式中加入高 DPI 支援與動態 DPI 支援的資訊,請參閱 Windows Forms 中的 High DPI 支援。

Windows Presentation Foundation(WPF)

在 .NET Framework 4.7 中,WPF 包含以下增強功能:

支援基於 Windows WM_POINTER 訊息的觸控/觸控筆軟體堆疊

你現在可以選擇使用基於WM_POINTER訊息的觸控或觸控筆技術組件,而非Windows墨水服務平台(WISP)。 這是 .NET Framework 中的一個選擇加入功能。 如需詳細資訊,請參閱 應用程式相容性 一節。

WPF列印 API 的新實作

WPF 的列印 API 在 System.Printing.PrintQueue 類別中呼叫 Windows Print Document Package API,而非已棄用的 XPS 列印 API。 如需此變更對應用程式相容性的影響,請參閱 應用程式相容性 一節。

.NET Framework 4.6.2 有哪些新內容

.NET Framework 4.6.2 在以下領域新增了新功能:

關於新增於 Framework 4.6.2 .NET API 的清單,請參見 .NET Framework 4.6.2 API Changes on GitHub。 若要取得 .NET Framework 4.6.2 的功能改進及錯誤修正清單,請參見 GitHub 上的 .NET Framework 4.6.2 變更列表。 欲了解更多資訊,請參閱.NET部落格中的 Announcing .NET Framework 4.6.2

ASP.NET

在 .NET Framework 4.6.2 中,ASP.NET 包含以下增強功能:

改善資料標註驗證器中本地化錯誤訊息的支援

資料註釋驗證器可讓您將一或多個屬性新增至類別內容來執行驗證。 屬性的 ValidationAttribute.ErrorMessage 元素會定義驗證失敗時錯誤訊息的文字。 從 .NET Framework 4.6.2 開始,ASP.NET 讓錯誤訊息的本地化變得容易。 如果出現以下情況,錯誤訊息將被當地語系化:

  1. 驗證屬性中提供了 ValidationAttribute.ErrorMessage

  2. 資源檔案儲存在App_LocalResources資料夾中。

  3. 本地化資源檔的名稱具有格式 DataAnnotation.Localization.{名稱}.resx,其中 名稱 是語言特性名稱,格式為 語言代碼-國家/地區代碼languageCode格式。

  4. 資源的索引鍵名稱是指派給屬性的 ValidationAttribute.ErrorMessage 字串,其值是當地語系化的錯誤訊息。

例如,下列資料註釋屬性定義了無效評分時預設文化的錯誤訊息。

public class RatingInfo
{
   [Required(ErrorMessage = "The rating must be between 1 and 10.")]
   [Display(Name = "Your Rating")]
   public int Rating { get; set; }
}
Public Class RatingInfo
   <Required(ErrorMessage = "The rating must be between 1 and 10.")>
   <Display(Name = "Your Rating")>
   Public Property Rating As Integer = 1
End Class

然後,您可以建立資源檔 DataAnnotation.Localization.fr.resx,其索引鍵是錯誤訊息字串,其值是當地語系化錯誤訊息。 在App.LocalResources資料夾中必須找到該文件。 例如,下列是本地化法文(fr)語言錯誤訊息中的鍵及其值:

名字 價值
評分必須介於 1 到 10 之間。 La note doit être comprise entre 1 et 10.

此外,資料註解本地化是可延伸的。 開發人員可以藉由實作 IStringLocalizerProvider 介面來插入自己的字串當地語系化提供者,以將當地語系化字串儲存在資源檔以外的位置。

工作階段狀態存放區提供者的 Async 支援

ASP.NET 現在允許與會話狀態儲存提供者一起使用任務回傳方法,從而讓 ASP.NET 應用程式能享有非同步的擴展性優勢。 為了支援與會話狀態儲存提供者的非同步操作,ASP.NET 包含一個新介面 System.Web.SessionState.ISessionStateModule,繼承自 IHttpModule,並允許開發者實作自己的會話狀態模組與非同步會話儲存提供者。 介面的定義如下:

public interface ISessionStateModule : IHttpModule {
    void ReleaseSessionState(HttpContext context);
    Task ReleaseSessionStateAsync(HttpContext context);
}
Public Interface ISessionStateModule : Inherits IHttpModule
   Sub ReleaseSessionState(context As HttpContext)
   Function ReleaseSessionStateAsync(context As HttpContext) As Task
End Interface

此外,該 SessionStateUtility 類別還包含兩個新方法, IsSessionStateReadOnly 以及 IsSessionStateRequired可用來支援非同步作業的方法。

輸出快取提供者的異步支援

從 .NET Framework 4.6.2 開始,任務回傳方法可搭配輸出快取提供者使用,以提供非同步的擴展性優勢。 實作這些方法的提供者能減少網頁伺服器上的執行緒阻塞,並提升 ASP.NET 服務的可擴展性。

已新增下列 API 以支援非同步輸出快取提供者:

角色類別

.NET Framework 4.6.2 中的字元依據 Unicode 標準,版本 8.0.0 分類。 在 .NET Framework 4.6 和 .NET Framework 4.6.1 中,字元是根據 Unicode 6.3 字元類別分類的。

對 Unicode 8.0 的支援僅限於依類別對 CharUnicodeInfo 字元進行分類,以及依賴它的類型和方法。 這些包括 StringInfo 類別、過載的 Char.GetUnicodeCategory 方法,以及 .NET Framework 正規表達式引擎所識別的 character 類別。 字元與字串的比較與排序不受此變更影響,仍依賴底層作業系統,或在 Windows 7 系統上依賴 .NET Framework 提供的字元資料。

如需從 Unicode 6.0 到 Unicode 7.0 的字元類別變更,請參閱 Unicode 聯盟網站上的 Unicode Standard, Version 7.0.0。 如需了解從 Unicode 7.0 更新至 Unicode 8.0 的變更,請參閱 Unicode 聯盟網站上的 Unicode 標準,版本 8.0.0

密碼學

X509 憑證的支援,其中包含 FIPS 186-3 DSA

.NET Framework 4.6.2 新增對 DSA(數位簽章演算法)X509 憑證的支援,這些憑證的金鑰超過 FIPS 186-2 1024 位元限制。

除了支援較大的 FIPS 186-3 金鑰大小外,.NET Framework 4.6.2 允許使用 SHA-2 雜湊演算法家族(SHA256、SHA384 和 SHA512)來計算簽章。 FIPS 186-3 支援是由新 System.Security.Cryptography.DSACng 類別提供。

配合 .NET Framework 4.6 中 RSA 類別的最新變更,以及 .NET Framework 4.6.1 中的 ECDsa 類別,.NET Framework 4.6.2 中的 DSA 抽象基底類別提供了額外的方法,讓呼叫者無需轉型即可使用此功能。 您可以呼叫 DSACertificateExtensions.GetDSAPrivateKey 擴充功能方法來簽署資料,如下列範例所示。

public static byte[] SignDataDsaSha384(byte[] data, X509Certificate2 cert)
{
    using (DSA dsa = cert.GetDSAPrivateKey())
    {
        return dsa.SignData(data, HashAlgorithmName.SHA384);
    }
}
Public Shared Function SignDataDsaSha384(data As Byte(), cert As X509Certificate2) As Byte()
    Using DSA As DSA = cert.GetDSAPrivateKey()
        Return DSA.SignData(data, HashAlgorithmName.SHA384)
    End Using
End Function

您可以呼叫 DSACertificateExtensions.GetDSAPublicKey 擴充方法來驗證已簽署的資料,如下列範例所示。

public static bool VerifyDataDsaSha384(byte[] data, byte[] signature, X509Certificate2 cert)
{
    using (DSA dsa = cert.GetDSAPublicKey())
    {
        return dsa.VerifyData(data, signature, HashAlgorithmName.SHA384);
    }
}
 Public Shared Function VerifyDataDsaSha384(data As Byte(), signature As Byte(), cert As X509Certificate2) As Boolean
    Using dsa As DSA = cert.GetDSAPublicKey()
        Return dsa.VerifyData(data, signature, HashAlgorithmName.SHA384)
    End Using
End Function

提高 ECDiffieHellman 金鑰衍生例程輸入的明確性

.NET Framework 3.5 新增了對橢圓曲線 Diffie-Hellman 金鑰一致性的支援,並支援三種不同的金鑰衍生函數(KDF)例程。 常式的輸入以及常式本身是透過物件上的 ECDiffieHellmanCng 屬性來配置的。 但是,由於並非每個例行程式都會讀取每個輸入屬性,因此開發人員可能會感到困惑。

為了在 .NET Framework 4.6.2 中解決此問題,ECDiffieHellman 基底類別新增以下三種方法,以更清楚地表示這些 KDF 例程及其輸入:

ECDiffieHellman 方法 描述
DeriveKeyFromHash(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[], Byte[]) 使用公式生成金鑰材料

HASH(secretPrepend || x || secretAppend)

HASH(secretPrepend OrElse x OrElse secretAppend)

其中 x 是 EC Diffie-Hellman 演算法的計算結果。
DeriveKeyFromHmac(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[], Byte[], Byte[]) 使用公式生成金鑰材料

HMAC(hmacKey, secretPrepend || x || secretAppend)

HMAC(hmacKey, secretPrepend OrElse x OrElse secretAppend)

其中 x 是 EC Diffie-Hellman 演算法的計算結果。
DeriveKeyTls(ECDiffieHellmanPublicKey, Byte[], Byte[]) 使用 TLS 虛擬隨機函數 (PRF) 衍生演算法衍生金鑰資料。

支援持續性金鑰對稱加密

Windows 密碼函式庫(CNG)新增了儲存持久對稱金鑰及使用硬體儲存對稱金鑰的支援,而 .NET Framework 4.6.2 讓開發者能夠利用此功能。 由於金鑰名稱和金鑰提供者的概念是實作特定的,因此使用這項功能需要利用具體實作類型的建構函式,而不是較常用的工廠方法(例如呼叫 Aes.Create)。

AES(AesCng)和 3DES(TripleDESCng)演算法提供保存密钥對稱加密支援。 例如:

public static byte[] EncryptDataWithPersistedKey(byte[] data, byte[] iv)
{
    using (Aes aes = new AesCng("AesDemoKey", CngProvider.MicrosoftSoftwareKeyStorageProvider))
    {
        aes.IV = iv;

        // Using the zero-argument overload is required to make use of the persisted key
        using (ICryptoTransform encryptor = aes.CreateEncryptor())
        {
            if (!encryptor.CanTransformMultipleBlocks)
            {
                throw new InvalidOperationException("This is a sample, this case wasn't handled...");
            }

            return encryptor.TransformFinalBlock(data, 0, data.Length);
        }
    }
}
Public Shared Function EncryptDataWithPersistedKey(data As Byte(), iv As Byte()) As Byte()
    Using Aes As Aes = New AesCng("AesDemoKey", CngProvider.MicrosoftSoftwareKeyStorageProvider)
        Aes.IV = iv

        ' Using the zero-argument overload Is required to make use of the persisted key
        Using encryptor As ICryptoTransform = Aes.CreateEncryptor()
            If Not encryptor.CanTransformMultipleBlocks Then
                Throw New InvalidOperationException("This is a sample, this case wasn't handled...")
            End If
            Return encryptor.TransformFinalBlock(data, 0, data.Length)
        End Using
    End Using
End Function

SignedXml 支援 SHA-2 哈希

.NET Framework 4.6.2 新增對 SignedXml 類別的支援,支援 RSA-SHA256、RSA-SHA384 及 RSA-SHA512 PKCS#1 簽章方法,以及 SHA256、SHA384 和 SHA512 參考摘要演算法。

URI 常數都公開在 SignedXml

SignedXml 欄位 恆定
XmlDsigSHA256Url "http://www.w3.org/2001/04/xmlenc#sha256"
XmlDsigRSASHA256Url "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
XmlDsigSHA384Url "http://www.w3.org/2001/04/xmldsig-more#sha384"
XmlDsigRSASHA384Url "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"
XmlDsigSHA512Url "http://www.w3.org/2001/04/xmlenc#sha512"
XmlDsigRSASHA512Url "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"

任何已在 SignatureDescription 註冊自訂 CryptoConfig 處理常式以新增這些演算法支援的程式,都會繼續像過去一樣運作;由於現在有平台預設值,因此不再需要註冊 CryptoConfig

SqlClient

.NET Framework Data Provider for SQL Server(System.Data.SqlClient)在 .NET Framework 4.6.2 版中包含以下新功能:

Azure SQL資料庫的連線池與超時設定

啟用連線池時若發生逾時或其他登入錯誤,會快取例外狀況,並在隨後的 5 秒到 1 分鐘內的連線嘗試中擲回該快取的例外狀況。 欲了解更多資訊,請參閱 SQL Server 連線池(ADO.NET)

這種行為在連接 Azure SQL 資料庫時並不理想,因為連線嘗試可能因短暫錯誤而失敗,而這些錯誤通常能很快恢復。 為了更好優化連線重試體驗,當連接 Azure SQL 資料庫失敗時,連線池封鎖期間行為會被移除。

新增 PoolBlockingPeriod 關鍵字可讓您選取最適合應用程式的封鎖期間。 值包括:

Auto

連接 Azure SQL Database 的應用程式的連線池封鎖期被停用,而連接其他 SQL Server 實例的應用程式則啟用連線池封鎖期。 這是預設值。 若伺服器端點名稱以以下任一結尾,則視為 Azure SQL 資料庫:

  • .database.windows.net

  • .database.chinacloudapi.cn

  • .database.usgovcloudapi.net

  • .database.cloudapi.de

AlwaysBlock

連接池阻塞期間始終啟用。

NeverBlock

連接集區封鎖期間一律停用。

Always Encrypted 的 增強功能

SQLClient 引進了 Always Encrypted 的兩項增強功能:

  • 為了提升針對加密資料庫欄位的參數化查詢效能,現在會快取查詢參數的加密元數據。 將屬性設定為 SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled(這是預設值)true 時,如果多次呼叫相同的查詢,用戶端只會從伺服器擷取參數中繼資料一次。

  • 密鑰快取中的欄位加密金鑰紀錄現在會在設定的時間間隔後被清除,並可使用 SqlConnection.ColumnEncryptionKeyCacheTtl 屬性進行設定。

Windows Communication Foundation

在 .NET Framework 4.6.2 中,Windows Communication Foundation 在以下幾個方面得到了增強:

使用 CNG 儲存之憑證的 WCF 傳輸安全性支援

WCF 傳輸安全性支援使用 Windows 密碼函式庫(CNG)儲存的憑證。 在 .NET Framework 4.6.2 中,此支援僅限於使用指數不超過 32 位元的公鑰憑證。 當應用程式針對 .NET Framework 4.6.2 時,此功能預設開啟。

針對 .NET Framework 4.6.1 及更早版本的應用程式,但又運行於 .NET Framework 4.6.2,可以透過在 app.config 或 web.config 檔案的 <runtime> 區段中新增以下行來啟用此功能。

<AppContextSwitchOverrides
    value="Switch.System.IdentityModel.DisableCngCertificates=false"
/>

這也可以使用如下程式碼以程式設計方式完成:

private const string DisableCngCertificates = @"Switch.System.IdentityModel.DisableCngCertificates";
AppContext.SetSwitch(disableCngCertificates, false);
Const DisableCngCertificates As String = "Switch.System.IdentityModel.DisableCngCertificates"
AppContext.SetSwitch(disableCngCertificates, False)

DataContractJsonSerializer 類別對於多個日光節約時間調整規則的更好支援

客戶可以使用應用程式組態設定來判斷類別是否 DataContractJsonSerializer 支援單一時區的多個調整規則。 這是一個選擇性功能。 若要啟用它,請將下列設定新增至您的 app.config 檔案:

<runtime>
     <AppContextSwitchOverrides value="Switch.System.Runtime.Serialization.DoNotUseTimeZoneInfo=false" />
</runtime>

啟用此功能時,DataContractJsonSerializer 物件會使用 TimeZoneInfo 類型,而不是 TimeZone 類型來為日期和時間資料進行反序列化。 TimeZoneInfo 支援多種調整規則,可以處理歷史時區資料; TimeZone 沒有。

如需結構和時區調整的詳細資訊 TimeZoneInfo ,請參閱 時區概觀

NetNamedPipeBinding 最符合

WCF 提供了一個新設定功能,允許用戶端應用程式確保它們始終連接到所要求的 URI 中最符合的接聽服務。 將此應用程式設定設為 false (預設值),用戶端可以使用 NetNamedPipeBinding 嘗試連線到接聽所要求 URI 子字串的服務。

例如,客戶端嘗試連線至 net.pipe://localhost/Service1的服務,但該電腦上一個具有管理員權限的不同服務正在監聽 net.pipe://localhost。 將此應用程式設定設定為 false時,用戶端會嘗試連線到錯誤的服務。 將應用程式設定設定為 true後,用戶端將始終連接到最佳匹配服務。

注意

用戶端使用服務的基本地址 NetNamedPipeBinding (如果存在)來尋找服務,而不是完整的端點地址。 若要確保此設定一律有效,服務應該使用唯一的基底位址。

若要啟用此變更,請將下列應用程式設定新增至用戶端應用程式的 App.config 或 Web.config 檔案:

<configuration>
    <appSettings>
        <add key="wcf:useBestMatchNamedPipeUri" value="true" />
    </appSettings>
</configuration>

SSL 3.0 不是預設通訊協定

當將 NetTcp 與傳輸安全性和憑證類型的認證類型搭配使用時,SSL 3.0 不再是用來交涉安全連線的預設通訊協定。 在大部分情況下,應該不會對現有應用程式造成影響,因為 TLS 1.0 包含在 NetTcp 的通訊協定清單中。 所有現有的用戶端都應該能夠至少使用 TLS 1.0 交涉連線。 如果需要 Ssl3,請使用下列其中一個組態機制,將它新增至交涉通訊協定清單。

Windows Presentation Foundation(WPF)

在 .NET Framework 4.6.2 中,Windows Presentation Foundation 在以下幾個方面都有所增強:

群組排序

使用 CollectionView 物件將資料分組的應用程式現在可以明確宣告如何排序群組。 明確排序可解決當應用程式動態新增或移除群組,或變更群組中涉及的專案屬性值時,所發生的非直覺排序問題。 它也可以透過將群組屬性的比較從整個集合的排序移至群組的排序,來提升群組建立過程的效能。

為了支援群組排序,新的 GroupDescription.SortDescriptionsGroupDescription.CustomSort 屬性描述了如何排序由 GroupDescription 物件產生的群組集合。 這類似於相同名稱 ListCollectionView 的屬性描述如何排序資料項目的方式。

PropertyGroupDescription類別的兩個新靜態屬性CompareNameAscendingCompareNameDescending可用於最常見的情況。

例如,下列 XAML 會依年齡將資料分組、依遞增順序排序年齡群組,以及依姓氏將每個年齡群組內的專案分組。

<GroupDescriptions>
     <PropertyGroupDescription
         PropertyName="Age"
         CustomSort=
              "{x:Static PropertyGroupDescription.CompareNamesAscending}"/>
     </PropertyGroupDescription>
</GroupDescriptions>

<SortDescriptions>
     <SortDescription PropertyName="LastName"/>
</SortDescriptions>

觸控式鍵盤支援

觸控鍵盤支援在 Windows 10 應用程式中,當觸控輸入被可接受文字輸入的控制項接收時,自動呼叫並關閉觸控鍵盤,從而實現 WPF 應用程式的焦點追蹤。

在先前版本的 .NET Framework 中,WPF 應用程式無法選擇加入對焦追蹤,除非關閉 WPF 筆觸/觸控手勢支援。 因此,WPF 應用程式必須在完整支援 WPF 觸控或依賴 Windows 滑鼠推廣之間做出選擇。

每監視器 DPI

為了因應近年來高 DPI 與混合 DPI 環境在 WPF 應用程式中的快速增長,.NET Framework 4.6.2 的 WPF 具備每台顯示器都能感知的能力。 想了解更多如何讓你的WPF應用程式能感知每個螢幕的 DPI 資訊,請參考 GitHub 上的 samples and developer guide

在先前版本的 .NET Framework 中,WPF 應用程式具備系統 DPI 感知。 換句話說,應用程式的 UI 會根據顯示該應用程式的監視器的 DPI,由作業系統適當地縮放調整。

對於在 .NET Framework 4.6.2 下運行的應用程式,你可以在應用程式配置檔的 <runtime> 區塊中添加配置語句,以停用 WPF 應用程式的每螢幕 DPI 變更,如下:

<runtime>
   <AppContextSwitchOverrides value="Switch.System.Windows.DoNotScaleForDpiChanges=false"/>
</runtime>

Windows 工作流程基礎(WF)

在 .NET Framework 4.6.2 中,Windows 工作流程基礎在以下方面得到了強化:

重新裝載 WF 設計工具中的 C# 運算式和 IntelliSense 支援

從 .NET Framework 4.5 開始,WF 支援 Visual Studio 設計器及程式碼工作流程中的 C# 表達式。 重設工作流程設計器是 WF 的一項關鍵功能,允許工作流程設計器位於 Visual Studio 以外的應用程式中(例如在 WPF 中)。 Windows Workflow Foundation 提供在 Rehosted Workflow Designer 中支援 C# 表達式與 IntelliSense 的能力。 欲了解更多資訊,請參閱 Windows Workflow Foundation 部落格

Availability of IntelliSense when a customer rebuilds a workflow project from Visual Studio 在 4.6.2 之前的 .NET Framework 版本中,當客戶從 Visual Studio 重建工作流程專案時,WF Designer IntelliSense 會失效。 當專案建置成功時,在設計工具上找不到工作流程類型,而且 IntelliSense 針對遺漏工作流程類型的警告會出現在 [錯誤清單] 視窗中。 .NET Framework 4.6.2 解決了這個問題,並讓 IntelliSense 可用。

現在帶有工作流程追蹤的工作流程 V1 應用程式會在 FIPS 模式下運行

已啟用 FIPS 遵循模式的機器現在可以成功執行具備工作流程追蹤功能的工作流程版本1樣式應用程式。 若要啟用此案例,您必須對 app.config 檔案進行下列變更:

<add key="microsoft:WorkflowRuntime:FIPSRequired" value="true" />

若未啟用此情境,執行應用程式時仍會產生異常訊息:「此實作不屬於 Windows 平台 FIPS 驗證的密碼演算法。」

使用 Visual Studio Workflow Designer 時,透過動態更新進行的工作流程改進

工作流程設計工具、流程圖活動設計工具和其他工作流程活動設計工具現在可以成功載入並顯示呼叫 DynamicUpdateServices.PrepareForUpdate 方法後已儲存的工作流程。 在 .NET Framework 4.6.2 之前的版本中,若在呼叫 DynamicUpdateServices.PrepareForUpdate 後將工作流程儲存,在 Visual Studio 中載入 XAML 檔案,可能會產生以下問題:

  • 工作流程設計工具無法正確載入 XAML 檔案(當ViewStateData.Id位於行尾時)。

  • 流程圖活動設計工具或其他工作流程活動設計工具可能會在其預設位置顯示所有物件,而不是附加屬性值。

ClickOnce

除了已支援的 1.0 通訊協定之外,ClickOnce 也已更新為支援 TLS 1.1 和 TLS 1.2。 ClickOnce 會自動偵測需要哪個通訊協定;不需要在 ClickOnce 應用程式內執行額外步驟,即可啟用 TLS 1.1 和 1.2 支援。

將 Windows Forms 和 WPF 應用程式轉換為 UWP 應用程式

Windows 現在提供將現有 Windows 桌面應用程式,包括 WPF 和 Windows Forms 應用程式,帶入 Universal Windows Platform (UWP) 的功能。 這項技術作為橋樑,讓你能逐步將現有程式碼遷移到 UWP,從而將應用程式帶到所有 Windows 10 裝置。

轉換後的傳統型應用程式會取得類似於 UWP 應用程式應用程式身分識別的應用程式身分識別,這可讓 UWP API 存取,以啟用動態磚和通知等功能。 該應用程序繼續像以前一樣運行,並作為完全信任的應用程序運行。 轉換應用程式之後,可以將應用程式容器程序新增至現有的完全信任程序,以新增調適型使用者介面。 當所有功能移至應用程式容器程序時,完全信任程序即可移除,新的 UWP 應用程式即可提供給所有 Windows 10 裝置。

偵錯改善

unmanaged debugging API 在 .NET Framework 4.6.2 中已得到增強,可以在拋出 NullReferenceException 時進行額外分析,從而判斷單一原始碼行中的哪個變數是 null。 為了支援此案例,下列 API 已新增至非受控偵錯 API。

.NET Framework 4.6.1 新增了什麼

.NET Framework 4.6.1 在以下領域新增了新功能:

欲了解更多關於 .NET Framework 4.6.1 的資訊,請參閱以下主題:

密碼學:支援包含 ECDSA 的 X509 憑證

.NET Framework 4.6 新增了對 X509 憑證的 RSACng 支援。 .NET Framework 4.6.1 新增對 ECDSA(橢圓曲線數位簽章演算法)X509 憑證的支援。

ECDSA 提供更好的效能,並且是比 RSA 更安全的加密演算法,在傳輸層安全性 (TLS) 效能和可擴展性受到關注的情況下提供了絕佳的選擇。 .NET Framework 的實作會將呼叫包裝進現有的 Windows 功能中。

以下範例程式碼展示了利用 .NET Framework 4.6.1 中新支援的 ECDSA X509 憑證,如何輕鬆產生位元組流的簽章。

using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

public class Net461Code
{
    public static byte[] SignECDsaSha512(byte[] data, X509Certificate2 cert)
    {
        using (ECDsa privateKey = cert.GetECDsaPrivateKey())
        {
            return privateKey.SignData(data, HashAlgorithmName.SHA512);
        }
    }

    public static byte[] SignECDsaSha512(byte[] data, ECDsa privateKey)
    {
        return privateKey.SignData(data, HashAlgorithmName.SHA512);
    }
}
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates

Public Class Net461Code
    Public Shared Function SignECDsaSha512(data As Byte(), cert As X509Certificate2) As Byte()
        Using privateKey As ECDsa = cert.GetECDsaPrivateKey()
            Return privateKey.SignData(data, HashAlgorithmName.SHA512)
        End Using
    End Function

    Public Shared Function SignECDsaSha512(data As Byte, privateKey As ECDsa) As Byte()
        Return privateKey.SignData(data, HashAlgorithmName.SHA512)
    End Function
End Class

這與 .NET Framework 4.6 中產生簽章所需的程式碼形成鮮明對比。

using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

public class Net46Code
{
    public static byte[] SignECDsaSha512(byte[] data, X509Certificate2 cert)
    {
        // This would require using cert.Handle and a series of p/invokes to get at the
        // underlying key, then passing that to a CngKey object, and passing that to
        // new ECDsa(CngKey).  It's a lot of work.
        throw new Exception("That's a lot of work...");
    }

    public static byte[] SignECDsaSha512(byte[] data, ECDsa privateKey)
    {
        // This way works, but SignData probably better matches what you want.
        using (SHA512 hasher = SHA512.Create())
        {
            byte[] signature1 = privateKey.SignHash(hasher.ComputeHash(data));
        }

        // This might not be the ECDsa you got!
        ECDsaCng ecDsaCng = (ECDsaCng)privateKey;
        ecDsaCng.HashAlgorithm = CngAlgorithm.Sha512;
        return ecDsaCng.SignData(data);
    }
}
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates

Public Class Net46Code
    Public Shared Function SignECDsaSha512(data As Byte(), cert As X509Certificate2) As Byte()
        ' This would require using cert.Handle and a series of p/invokes to get at the
        ' underlying key, then passing that to a CngKey object, and passing that to
        ' new ECDsa(CngKey).  It's a lot of work.
        Throw New Exception("That's a lot of work...")
    End Function

    Public Shared Function SignECDsaSha512(data As Byte(), privateKey As ECDsa) As Byte()
        ' This way works, but SignData probably better matches what you want.
        Using hasher As SHA512 = SHA512.Create()
            Dim signature1 As Byte() = privateKey.SignHash(hasher.ComputeHash(data))
        End Using

        ' This might not be the ECDsa you got!
        Dim ecDsaCng As ECDsaCng = CType(privateKey, ECDsaCng)
        ecDsaCng.HashAlgorithm = CngAlgorithm.Sha512
        Return ecDsaCng.SignData(data)
    End Function
End Class

ADO.NET

以下內容已新增至 ADO.NET:

Always Encrypted 支援硬體保護的密鑰

ADO.NET 現在支援在硬體安全模組(HSM)中原生儲存 Always Encrypted 欄位主金鑰。 透過此支援,客戶可以利用儲存在 HSM 中的非對稱金鑰,而不需要撰寫自訂資料行主要金鑰存放區提供者,並在應用程式中註冊它們。

客戶必須在應用程式伺服器或用戶端計算機上安裝 HSM 廠商提供的 CSP 提供者或 CNG 金鑰存放區提供者,才能存取以 HSM 中儲存的數據行主要密鑰保護的 Always Encrypted 資料。

MultiSubnetFailover 連線行為

SqlClient 現在會自動提供與 AlwaysOn 可用性群組 (AG) 的更快連線。 它會以透明方式偵測您的應用程式是否連線到不同子網上的 AlwaysOn 可用性群組 (AG),並快速探索目前的使用中伺服器,並提供與伺服器的連線。 在此版本之前,應用程式必須將連接字串設置為包含 "MultisubnetFailover=true",以表示正在連接到 AlwaysOn 可用性群組。 若未將 connection 關鍵詞設定為 true,應用程式在連線至 AlwaysOn 可用性群組時可能會遇到逾時。 在此版本中,應用程式不需要再 將 設定為 。 如需 SqlClient 支援 Always On 可用性群組的詳細資訊,請參閱 SqlClient 支援高可用性、災害復原

Windows Presentation Foundation(WPF)

Windows Presentation Foundation 包含多項改進與變更。

效能提升

觸發觸碰事件的延遲問題已在 .NET Framework 4.6.1 中修正。 此外,快速輸入時,輸入 RichTextBox 控制碼不再占用渲染線程。

拼字檢查改善

WPF 中的拼字檢查器已在 Windows 8.1 及更新版本中更新,以利用作業系統支援來進行其他語言的拼字檢查。 Windows 8.1 之前的 Windows 版本功能沒有改變。

如同先前版本的 .NET Framework,會透過以下順序尋找資訊來偵測 TextBox 控制項或 RichTextBox 區塊的語言:

  • xml:lang,如果它存在的話。

  • 目前的輸入語言。

  • 目前的文化。

欲了解更多關於 WPF 語言支援的資訊,請參閱 WPF 部落格文章,.NET Framework 4.6.1 features

針對每位使用者的自訂字典提供額外支援

在 .NET Framework 4.6.1 中,WPF 識別全球註冊的自訂字典。 除了能夠為每個控件註冊這些功能之外,還提供這項功能。

在先前版本的 WPF 中,自訂字典無法辨識排除詞彙與自動更正清單。 它們在Windows 8.1和Windows 10上都被支援,透過可放置於 %AppData%\Microsoft\Spelling\<language tag> 目錄下的檔案。 下列規則適用於這些檔案:

  • 檔案的副檔名應為 .dic (新增的字詞)、.exc (排除的字詞) 或 .acl (自動更正) 。

  • 檔案應該是以位元組順序標記 (BOM) 開頭的 UTF-16 LE 純文字。

  • 每一行都應該包含在新增和排除的字詞清單中的一個單字,或在自動更正字清單中的以垂直線("|")分隔的自動更正配對。

  • 這些檔案被視為唯讀,系統不會修改。

注意

這些新檔案格式並未直接受到 WPF 拼字檢查 API 的支援,且應用程式中提供給 WPF 的自訂字典應繼續使用 .lex 檔案。

範例

Microsoft/WPF-Samples GitHub 資料庫中有多個WPF樣本。 請透過發送拉取請求或開啟GitHub問題,協助我們改進樣本。

DirectX 延伸模組

WPF 包含一個 NuGet 套件,提供新的 D3DImage 實作,讓你可以輕鬆與 DX10 和 Dx11 內容互通。 此套件的程式碼已開源,並可於GitHub<>取得。

Windows 工作流程基礎:交易

Transaction.EnlistPromotableSinglePhase 方法現在可以使用 MSDTC 以外的分散式交易管理員來提升交易。 您可以透過將 GUID 交易促進器識別碼指定給新的 Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification, Guid) 多載來完成此動作。 如果此作業成功,則交易的功能會受到限制。 一旦登記非 MSDTC 交易升級程式之後,下列方法會擲回 TransactionPromotionException,因為這些方法需要升級至 MSDTC:

一旦登記了非 MSDTC 的交易促進者,未來的持久性登記必須使用它所定義的通訊協定。 您可以使用 Guid 屬性來取得交易推動者 PromoterType。 當交易推廣時,交易推廣者會提供代表已推廣令牌的 Byte 陣列。 應用程式可以使用 GetPromotedToken 方法來取得非 MSDTC 升級交易的升級令牌。

Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification, Guid) 重載的使用者必須遵循特定的呼叫順序,以完成晉升操作。 這些規則記載於方法的說明文件。

程式代碼剖析

Unmanaged 分析 API 已增強,如下所示:

  • ICorProfilerInfo7 介面中,有更佳的支援來存取 PDB。

    在 ASP.NET Core 中,組合檔由 Roslyn 在記憶體中編譯變得越來越普遍。 對於製作分析工具的開發人員來說,這表示歷來在磁碟上序列化的 PDB 可能不再存在。 分析器工具通常使用 PDB 將程式碼對應回原始碼行,以執行程式碼涵蓋範圍或逐行效能分析等任務。 ICorProfilerInfo7 介面現在包含兩個新方法,ICorProfilerInfo7::GetInMemorySymbolsLengthICorProfilerInfo7::ReadInMemorySymbols,可讓這些分析器工具存取記憶體內部 PDB 數據,藉由使用新的 API,分析器可以取得記憶體內部 PDB 的內容作為位元組陣列,然後處理它或將它序列化至磁碟。

  • 使用 ICorProfiler 介面進行更好的檢測。

    使用 ICorProfiler 應用程式介面中的 ReJit 功能進行動態監控的剖析器現在可以修改某些元數據。 以前,這類工具可以隨時檢測 IL,但只能在模組載入時修改中繼資料。 因為 IL 是指元數據,所以這限制了可進行的工具化類型。 我們藉由新增 ICorProfilerInfo7::ApplyMetaData 方法,支援模組載入之後的部分元數據編輯,特別是透過新增 AssemblyRefTypeRefTypeSpecMemberRefMemberSpecUserString 記錄來解除其中一些限制。 這項變更使得可以進行更廣泛的實時檢測。

原生映像生成器 (NGEN) PDB 檔案

跨機器事件追蹤讓客戶能在機器 A 上設定程式,並在機器 B 上使用原始碼行映射查看資料。使用先前版本的 .NET 框架,使用者會將所有模組與原生映像從設定檔的機器複製到包含 IL PDB 的分析機器,以建立原始碼到原生的映射。 雖然此過程在檔案相對較小時效果良好,例如在手機應用程式中,但桌面系統上的檔案可能非常大,而且需要大量時間才能複製。

使用 NGen PDB 時,NGen 可以建立一個 PDB,包含從 IL 映射到原生代碼的對應關係,無需依賴 IL PDB。 在我們的跨機器事件追蹤案例中,只需要將機器 A 產生的原生映射 PDB 複製到機器 B,並使用 偵錯介面存取 API 來讀取 IL PDB 的來源to-IL 對應和原生映射 PDB 的 IL 對原生對應。 將這兩個對應結合可提供來源到本地化的對應。 由於原生映像 PDB 比所有模組和原生映像小得多,因此從機器 A 到機器 B 的複製過程會快很多。

.NET 2015 有什麼新內容

.NET 2015 推出 .NET Framework 4.6 與 .NET 核心。 部分新功能適用於兩者,其他功能則是 .NET Framework 4.6 或 .NET Core 專屬。

  • ASP.NET 核心

    .NET 2015 包含 ASP.NET Core,這是一種精簡的 .NET 實作,用於打造現代雲端應用程式。 ASP.NET Core 是模組化的,所以你只能包含應用程式中所需的功能。 它可以託管在 IIS 上,也可以在自訂程序中自架,並且你可以在同一台伺服器上運行不同版本的 .NET 框架應用程式。 它包括一個專為雲端部署而設計的新環境配置系統。

    MVC、Web API 和網頁統一到一個稱為 MVC 6 的單一框架中。 你可以透過 Visual Studio 2015 或更新版本的工具來建置 ASP.NET Core 應用程式。 你現有的應用程式可以在新的 .NET Framework 上運作;但若要建立使用 MVC 6 或 SignalR 3 的應用程式,必須使用 Visual Studio 2015 或更新版本的專案系統。

    詳情請參見ASP.NET Core

  • ASP.NET 更新

    • 任務導向 API for 異步回應排清

      ASP.NET 現在提供一個簡單的任務式 API,用於非同步回應刷新,HttpResponse.FlushAsync,允許利用語言的 async/await 支援以非同步方式刷新回應。

    • 模型繫結支援回傳任務的函式

      在 .NET Framework 4.5 中,ASP.NET 新增了模型綁定功能,使網頁表單頁面與使用者控制項中基於 CRUD 的資料操作能以可擴充且以程式碼為核心的方式。 模型繫結系統現在支援返回 Task的模型繫結方法。 這項功能可讓 Web Forms 開發人員在使用較新版本的 ORM,包括 Entity Framework 時,可隨著資料繫結系統的便利性,輕鬆取得異步操作的可擴展性優勢。

      非同步模型繫結由 aspnet:EnableAsyncModelBinding 組態設定控制。

      <appSettings>
          <add key=" aspnet:EnableAsyncModelBinding" value="true|false" />
      </appSettings>
      

      在 Framework 4.6 .NET目標應用程式中,預設為 true。 在運行於 .NET Framework 4.6 且針對較早版本的 .NET Framework 的應用程式中,預設為 false。 您可以透過將組態設定設定為 true來啟用。

    • HTTP/2 支援 (Windows 10)

      HTTP/2 是 HTTP 協定的新版本,可提供更好的連線利用率(減少用戶端和伺服器之間的往返),從而降低使用者的網頁載入延遲。 網頁(相比於服務)最能從 HTTP/2 獲益,因為該協議優化了在單次操作中請求的多個資源。 在 .NET Framework 4.6 中,ASP.NET 已新增了對 HTTP/2 的支援。 由於網路功能存在於多層,Windows、IIS 及 ASP.NET 需要新功能以啟用 HTTP/2。 你必須使用 Windows 10 才能使用 HTTP/2 搭配 ASP.NET。

      HTTP/2 也支援且預設開啟,對於 Windows 10 的 Universal Windows Platform (UWP) 應用程式使用 System.Net.Http.HttpClient API 的情況。

      為了在 ASP.NET 應用中使用 PUSH_PROMISE 特性,已在 PushPromise(String) 類別中新增了一個方法,包含兩個過載 PushPromise(String, String, NameValueCollection)HttpResponse

      注意

      雖然 ASP.NET Core 支援 HTTP/2,但尚未新增 PUSH PROMISE 功能。

      瀏覽器和網頁伺服器(Windows 上的 IIS)會完成所有工作。 您不必為使用者做任何繁重的工作。

      大多數 主要瀏覽器都支援 HTTP/2,因此如果您的伺服器支援 HTTP/2,您的使用者很可能會受益於 HTTP/2 支援。

    • 支援令牌系結通訊協定

      Microsoft 和 Google 一直在合作開發一種新的驗證方法,稱為 令牌綁定通訊協定。 前提是身份驗證令牌(在您的瀏覽器緩存中)可能會被竊取並被犯罪分子用來訪問其他安全的資源(例如,您的銀行帳戶),而無需您的密碼或任何其他特權知識。 新協議旨在緩解這個問題。

      令牌綁定協定將作為瀏覽器功能在 Windows 10 中實作。 ASP.NET 應用程式會參與該協定,以確保認證憑證的合法性。 用戶端和伺服器實作會建立通訊協定所指定的端對端保護。

    • 隨機字串雜湊演算法

      .NET Framework 4.5 引入了隨機字串雜湊演算法。 然而,由於 ASP.NET 的一些功能依賴穩定的雜湊碼,ASP.NET 並未支援此功能。 在 .NET Framework 4.6 中,現在支援隨機字串雜湊演算法。 若要啟用此功能,請使用 aspnet:UseRandomizedStringHashAlgorithm 組態設定。

      <appSettings>
          <add key="aspnet:UseRandomizedStringHashAlgorithm" value="true|false" />
      </appSettings>
      
  • ADO.NET

    ADO .NET 現已支援 SQL Server 2016 中提供的 Always Encrypted 功能。 使用 Always Encrypted,SQL Server 可以對加密資料執行操作,且最棒的是,加密金鑰位於應用程式內部,且位於客戶可信環境內,而非伺服器端。 Always Encrypted 會保護客戶資料,讓 DBA 無法存取純文字資料。 資料的加密和解密在驅動程式層級透明地進行,將必須對現有應用程式進行的變更降到最低。 詳情請參見 Always Encrypted (Database Engine)Always Encrypted (client development)

  • 適用於管理的代碼的 64 位 JIT 編譯程式

    .NET Framework 4.6 新增了 64 位元 JIT 編譯器(最初代號 RyuJIT)。 新的 64 位編譯器比舊的 64 位 JIT 編譯器提供了顯著的性能改進。 新的 64 位元編譯器支援運行於 .NET Framework 4.6 上的 64 位元程序。 如果應用程式編譯為 64 位元或 AnyCPU,且在 64 位元作業系統上執行,則會在 64 位元進程中執行。 雖然在新的編譯程式的轉換過程中已盡量做到透明,但行為可能會發生變更。

    新的 64 位 JIT 編譯器還包括硬件 SIMD 加速功能,當與命名空間中 System.Numerics 啟用 SIMD 的類型結合時,可以產生良好的性能改進。

  • 元件載入器改善

    元件載入器現在會在載入對應的 NGEN 影像後,卸載 IL 元件,以更有效率地使用記憶體。 此變更減少虛擬記憶體,對大型 32 位元應用程式(如 Visual Studio)特別有利,同時也能節省實體記憶體。

  • 基類程式庫變更

    許多新 API 被加入到 .NET Framework 4.6,以啟用關鍵場景。 其中包括下列變更和新增:

    • IReadOnlyCollection<T> 實作

      其他集合會實作 IReadOnlyCollection<T> ,例如 Queue<T>Stack<T>

    • CultureInfo.CurrentCulture 和 CultureInfo.CurrentUICulture

      CultureInfo.CurrentCultureCultureInfo.CurrentUICulture 屬性現在是讀寫,而不是唯讀的。 將新的 CultureInfo 物件指派給這些屬性時,Thread.CurrentThread.CurrentCulture 屬性所定義的目前執行緒文化特性,以及 Thread.CurrentThread.CurrentUICulture 屬性所定義的目前 UI 執行緒文化特性也會隨之變更。

    • 垃圾回收功能增強(GC)

      GC 類別現在包含 TryStartNoGCRegionEndNoGCRegion 方法,可讓您在執行重要路徑期間禁止記憶體回收。

      GC.Collect(Int32, GCCollectionMode, Boolean, Boolean) 方法的新多載版本可讓您控制是小型物件堆積和大型物件堆積同時進行橫掃和壓縮,還是僅進行橫掃。

    • 已啟用 SIMD 的 類型

      System.Numerics命名空間現在包含許多已啟用 SIMD 的類型,例如 Matrix3x2Matrix4x4PlaneQuaternionVector2Vector3Vector4和 。

      因為新的 64 位 JIT 編譯器也包含硬體 SIMD 加速功能,所以搭配新的 64 位 JIT 編譯器使用啟用 SIMD 的類型時,效能會特別顯著改善。

    • 密碼學更新

      System.Security.Cryptography API 正在更新以支援 Windows CNG 密碼學 API。 先前版本的 .NET 框架完全依賴於早期版本的 Windows 密碼學 API作為 System.Security.Cryptography 實作的基礎。 我們收到了支持 CNG API 的請求,因為它支持 現代加密算法,這對於某些類別的應用程序很重要。

      .NET Framework 4.6 包含以下新增功能以支援 Windows CNG 密碼 API:

      • X509 證書、System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPublicKey(System.Security.Cryptography.X509Certificates.X509Certificate2)System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPrivateKey(System.Security.Cryptography.X509Certificates.X509Certificate2)的一組擴充方法,當有可能時會返回以 CNG 為基礎的實作,而非以 CAPI 為基礎的實作。 (有些智慧卡等設備仍然需要 CAPI,而 APIs 會處理後援機制)。

      • 類別 System.Security.Cryptography.RSACng ,提供 RSA 演算法的 CNG 實作。

      • RSA API 的功能增強,使常見操作不再需要類型轉換。 例如,使用 X509Certificate2 物件加密資料,需要像 .NET Framework 先前版本中類似的程式碼。

        RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey;
        byte[] oaepEncrypted = rsa.Encrypt(data, true);
        byte[] pkcs1Encrypted = rsa.Encrypt(data, false);
        
        Dim rsa As RSACryptoServiceProvider = CType(cert.PrivateKey, RSACryptoServiceProvider)
        Dim oaepEncrypted() As Byte = rsa.Encrypt(data, True)
        Dim pkcs1Encrypted() As Byte = rsa.Encrypt(data, False)
        

        使用 .NET Framework 4.6 中新密碼 API 的程式碼可重寫如下,以避免 cast。

        RSA rsa = cert.GetRSAPrivateKey();
        if (rsa == null)
           throw new InvalidOperationException("An RSA certificate was expected");
        
        byte[] oaepEncrypted = rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA1);
        byte[] pkcs1Encrypted = rsa.Encrypt(data, RSAEncryptionPadding.Pkcs1);
        
        Dim rsa As RSA = cert.GetRSAPrivateKey()
        If rsa Is Nothing Then
            Throw New InvalidOperationException("An RSA certificate was expected")
        End If
        
        Dim oaepEncrypted() As Byte = rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA1)
        Dim pkcs1Encrypted() As Byte = rsa.Encrypt(data, RSAEncryptionPadding.Pkcs1)
        
    • 支援將日期和時間轉換成 Unix 時間

      下列新方法已被添加到 DateTimeOffset 結構中,以支援日期和時間值與 Unix 時間之間的轉換:

    • 兼容性開關

      AppContext 類別新增了新的相容性功能,使程式庫開發者能為使用者提供統一的選擇不參加機制。 它會在元件之間建立鬆散耦合的合約,以傳達選擇退出要求。 當對現有功能進行變更時,此功能通常很重要。 相反地,對於新功能來說,已經有隱含的默認同意。

      使用 AppContext,程式庫會定義並公開相容性參數,而相依於它們的程式碼可以設定這些參數來影響程式庫行為。 根據預設,程式庫會提供新功能,只有在設定開關時,它們才會改變功能(也就是說,它們會提供先前的功能)。

      應用程式(或程式庫)可以宣告相依程式庫所定義的開關數值(一律為 Boolean 值)。 這個開關總是隱含 false。 將開關設定為 true 以啟用它。 明確將開關設定為 false 會實現新的行為。

      AppContext.SetSwitch("Switch.AmazingLib.ThrowOnException", true);
      
      AppContext.SetSwitch("Switch.AmazingLib.ThrowOnException", True)
      

      函式庫必須檢查使用者是否已宣告開關的值,然後對其採取適當的行動。

      if (!AppContext.TryGetSwitch("Switch.AmazingLib.ThrowOnException", out shouldThrow))
      {
          // This is the case where the switch value was not set by the application.
          // The library can choose to get the value of shouldThrow by other means.
          // If no overrides nor default values are specified, the value should be 'false'.
          // A false value implies the latest behavior.
      }
      
      // The library can use the value of shouldThrow to throw exceptions or not.
      if (shouldThrow)
      {
          // old code
      }
      else
      {
          // new code
      }
      
      If Not AppContext.TryGetSwitch("Switch.AmazingLib.ThrowOnException", shouldThrow) Then
          ' This is the case where the switch value was not set by the application.
          ' The library can choose to get the value of shouldThrow by other means.
          ' If no overrides nor default values are specified, the value should be 'false'.
          ' A false value implies the latest behavior.
      End If
      
      ' The library can use the value of shouldThrow to throw exceptions or not.
      If shouldThrow Then
          ' old code
      Else
          ' new code
      End If
      

      使用一致的格式來處理開關是很有幫助的,因為它們是由函式庫公開的正式合約。 以下是兩種明顯的格式。

      • 開關命名空間switchname

      • 開關函式庫switchname

    • 以任務為基礎的非同步模式的變更 (TAP)

      針對 .NET Framework 4.6 的應用程式,TaskTask<TResult> 物件會繼承呼叫執行緒的文化與 UI 文化。 針對先前版本 .NET Framework 或未針對特定版本 .NET Framework 的應用程式行為則不受影響。 如需詳細資訊,請參閱 CultureInfo 類別主題中「文化與基於任務的非同步操作」這一節。

      System.Threading.AsyncLocal<T> 類別可讓您表示本地於指定異步控制流程的環境數據,例如 async 方法。 它可用來跨執行緒保存資料。 您也可以定義一個 callback 方法,每當環境數據因 AsyncLocal<T>.Value 屬性明確變更或線程遇到上下文轉換而變更時,就會收到通知。

      三種便利方法,Task.CompletedTaskTask.FromCanceledTask.FromException,已新增至以任務為基礎的非同步模式(TAP),以傳回處於特定狀態的已完成的任務。

      NamedPipeClientStream 類別現在支援與其新 ConnectAsync進行異步通訊。 方法。

    • EventSource 現在支援寫入事件記錄檔

      您現在可以使用 EventSource 類別,將系統管理或操作訊息記錄到事件記錄檔,以及計算機上建立的任何現有 ETW 工作階段。 過去,您必須使用 Microsoft.Diagnostics.Tracing.EventSource NuGet 套件來取得這項功能。 此功能現已內建於 .NET Framework 4.6 中。

      NuGet 套件與 .NET Framework 4.6 均已更新,新增以下功能:

      • 動態事件

        允許「即時」定義事件,而不建立事件方法。

      • 豐富承載

        允許傳遞具有特殊屬性的類別和陣列,以及基本類型作為承載。

      • 活動追蹤

        促使啟動和停止活動以用一個表示所有當前活躍活動的標識碼來標記其間的事件。

      為了支援這些功能,已將重載 Write 方法新增至 EventSource 類別。

  • Windows Presentation Foundation (WPF)

    • 高密度像素顯示的改善

      WPF 的 HDPI 支援在 .NET Framework 4.6 中變得更好。 已針對佈局的圓角化處理進行變更,以減少具有邊框的控制項中出現裁切的情況。 預設情況下,只有當你的 TargetFrameworkAttribute 設定為 .NET Framework 4.6 時,此功能才會啟用。 針對早期版本框架並且運行於 .NET Framework 4.6 的應用程式,可以透過在 app.config 檔案的 <runtime> 區塊中新增以下行來選擇加入此新行為:

      <AppContextSwitchOverrides
      value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=false"
      />
      

      跨越多個螢幕、且具有不同 DPI 設定的 WPF 視窗(多 DPI 設定)現在可以完全渲染,不再出現未渲染的區域。 您可以將下列這一行新增至 app.config 檔案的 <appSettings> 區段,以停用此新行為,從而選擇退出該行為:

      <add key="EnableMultiMonitorDisplayClipping" value="true"/>
      

      System.Windows.Input.Cursor新增了根據 DPI 設定自動載入右游標的支援。

    • 觸感更好

      Connect 上的客戶報告指出,觸控會產生不可預測的行為,已在 .NET Framework 4.6 中得到回應。 Windows 商店應用程式與 WPF 應用程式的雙重點擊門檻現在在 Windows 8.1 及以上版本中已保持一致。

    • 透明子窗口的支援功能

      .NET Framework 4.6 中的 WPF 支援 Windows 8.1 及以上版本的透明子視窗。 這可讓您在頂層視窗中建立非矩形和透明的子視窗。 您可以將屬性設定 HwndSourceParameters.UsesPerPixelTransparencytrue來啟用此功能。

  • Windows Communication Foundation (WCF)

    • SSL 支援

      WCF 現在支援 TLS 版本 1.1 和 1.2,以及 SSL 3.0 和 TLS 1.0,當使用 NetTcp 搭配傳輸安全性和用戶端驗證時。 現在可以選擇要使用的協定,或停用舊的安全性較低的協定。 這可以透過設定 SslProtocols 屬性或將下列內容新增至組態檔來完成。

      <netTcpBinding>
          <binding>
            <security mode= "None|Transport|Message|TransportWithMessageCredential" >
                <transport clientCredentialType="None|Windows|Certificate"
                          protectionLevel="None|Sign|EncryptAndSign"
                          sslProtocols="Ssl3|Tls1|Tls11|Tls12">
                  </transport>
            </security>
          </binding>
      </netTcpBinding>
      
    • 使用不同的 HTTP 連線傳送訊息

      WCF 現在允許使用者確保使用不同的基礎 HTTP 連線傳送某些訊息。 有兩種方式可以執行這項作:

      • 使用聯機組名字首

        用戶可以指定一個字串,作為 WCF 連接組名前置詞。 使用不同的基礎 HTTP 連線傳送具有不同前置詞的兩則訊息。 您可以將索引鍵/值組新增至訊息的 Message.Properties 屬性,以設定前綴。 鑰匙為 "HttpTransportConnectionGroupNamePrefix";值是所需的前綴。

      • 使用不同的通道處理站

        使用者還可以啟用一項功能,確保使用不同通道工廠建立的通道傳送的訊息將使用不同的底層 HTTP 連線。 若要啟用此功能,使用者必須將下列專案 appSetting 設定為 true

        <appSettings>
            <add key="wcf:httpTransportBinding:useUniqueConnectionPoolPerFactory" value="true" />
        </appSettings>
        
  • Windows 工作流程基金會(WWF)

    您現在可以指定工作流程服務在遇到 "非通訊協定" 書籤未完成的情況下,對於順序錯亂的作業請求保持的秒數,這樣在逾時請求之前即可管理等候時間。 「非協議」書籤是與尚未完成接收操作無關的書籤。 某些活動會在其實作中建立非通訊協定書籤,因此非通訊協定書籤可能並不明顯。 其中包括 [狀態] 和 [挑選]。 因此,如果您有使用狀態機或包含 Pick 活動的工作流程服務,您很可能會有非協議書籤。 您可以將如下所示的行新增至 appSettings app.config 檔案的區段來指定間隔:

    <add key="microsoft:WorkflowServices:FilterResumeTimeoutInSeconds" value="60"/>
    

    預設值為 60 秒。 如果 value 設定為 0,則會立即拒絕順序錯亂的要求,並顯示類似以下文字的錯誤:

    Operation 'Request3|{http://tempuri.org/}IService' on service instance with identifier '2b0667b6-09c8-4093-9d02-f6c67d534292' cannot be performed at this time. Please ensure that the operations are performed in the correct order and that the binding in use provides ordered delivery guarantees.
    

    如果您收到順序錯誤作業訊息且沒有非通訊協定書籤,則會收到相同的訊息。

    如果元素的 FilterResumeTimeoutInSeconds 值為非零,則有非通訊協定書籤,且逾時間隔到期,則作業會失敗,並顯示逾時訊息。

  • 交易

    您現在可以包含造成衍生自 TransactionException 例外狀況之交易的分散式交易識別碼。 您可以透過將下列索引鍵 appSettings 新增至 app.config 檔案的區段來執行此操作:

    <add key="Transactions:IncludeDistributedTransactionIdInExceptionMessage" value="true"/>
    

    預設值是 false

  • 網路

    • 套接字重複使用

      Windows 10 包含一種新的高擴展性網路演算法,透過重用本地埠碼來進行 TCP 外站連線,更有效利用機器資源。 .NET Framework 4.6 支援此新演算法,使 .NET 應用程式能利用此新行為。 在先前的 Windows 版本中,有一個人為的並行連線限制(通常是 16,384,為動態埠範圍的預設大小),這可能導致負載時埠口耗盡,限制服務的擴展性。

      在 .NET Framework 4.6 中,新增了兩個 API,以啟用埠重用,實際上消除了同時連線的 64 KB 限制:

      根據預設,ServicePointManager.ReusePort 屬性會是 false,除非 HWRPortReuseOnSocketBind 登錄機碼的 HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 值設定為 0x1。 若要在 HTTP 連線上啟用本端埠重複使用,請將 ServicePointManager.ReusePort 內容設為 true。 這使得所有來自 HttpClientHttpWebRequest 的 TCP socket 連線都使用新的 Windows 10 socket 選項 SO_REUSE_UNICASTPORT,以實現本地埠重用。

      撰寫僅使用套接字的應用程式的開發人員可以在呼叫 System.Net.Sockets.SocketOptionName 之類的方法時指定 Socket.SetSocketOption 選項,讓外部套接字在綁定時重複使用本機埠。

    • 支持國際域名和 PunyCode

      類別中IdnHost新增了新屬性Uri,以更好地支援國際網域名稱和 PunyCode。

  • 在 Windows Forms 控制項中調整大小。

    此功能在 .NET Framework 4.6 中擴充,包含 DomainUpDownNumericUpDownDataGridViewComboBoxColumnDataGridViewColumnToolStripSplitButton 類型,以及在繪製 Bounds 時所用的由 UITypeEditor 屬性所指定的矩形。

    這是一個選擇性功能。 若要啟用它,請在應用程式組態 (app.config) 檔案中將 EnableWindowsFormsHighDpiAutoResizing 元素設定為 true

    <appSettings>
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
    </appSettings>
    
  • 支援代碼頁編碼

    .NET Core 主要支援 Unicode 編碼,預設對代碼頁編碼提供有限支援。 你可以透過註冊 Encoding.RegisterProvider 方法來新增對 .NET Framework 中可用、.NET Core 中不支援的代碼頁編碼的支援。 如需詳細資訊,請參閱System.Text.CodePagesEncodingProvider

  • .NET Native 或 .NET 原生

以 C# 或 Visual Basic 撰寫的 Universal Windows Platform (UWP) 應用程式,可以利用一種將應用程式編譯成原生程式碼而非 IL 的新技術。 這項技術產生的應用程式啟動和執行時間更快。 欲了解更多資訊,請參閱 Compiling Apps with .NET Native。 關於 .NET Native 的概述,探討它與 JIT 編譯和 NGEN 的差異,以及這對你的程式碼意味著什麼,請參見 .NET Native and Compilation

當你用 Visual Studio 2015 或更新版本編譯應用程式時,預設會編譯成原生程式碼。 欲了解更多資訊,請參閱入門.NET Native

為了支援除錯 .NET 原生應用程式,已在非管理除錯 API 中新增了介面與列舉。 如需詳細資訊,請參閱偵錯 (非受控 API 參考)。

  • 開源.NET框架套件

    .NET核心套件如不可變集合、SIMD APIS,以及網路 API,如 System.Net.Http 命名空間中的,現已以開源套件形式在 GitHub 上提供。 欲取得代碼,請參見.NET 在 GitHub。 欲了解更多資訊及如何貢獻這些套件,請參閱.NET導論、.NET GitHub首頁。

.NET Framework 4.5.2 的新內容

.NET Framework 4.5.1 新增了什麼

2014 年 4 月更新

  • Visual Studio 2013 更新 2 包含對可攜式類別庫範本的更新,以支援以下情境:

    • 你可以在針對 Windows 8.1、Windows Phone 8.1 和 Windows Phone Silverlight 8.1 的可攜式函式庫中使用 Windows Runtime API。

    • 你可以在目標為 Windows 8.1 或 Windows Phone 8.1 的可攜式函式庫中包含 XAML (Windows.UI.XAML 類型)。 支援下列 XAML 範本:空白頁面、資源字典、範本化控制項和使用者控制項。

    • 你可以建立一個可攜式的 Windows Runtime 元件(.winmd 檔案),用於針對 Windows 8.1 和 Windows Phone 8.1 的商店應用程式。

    • 你可以重新定位 Windows 商店或 Windows Phone Store 的類別函式庫,就像 Portable 類別庫一樣。

    如需這些變更的詳細資訊,請參閱 可攜式類別庫

  • .NET Framework 內容集現已包含 .NET Native 的文件,這是一種用於建置與部署 Windows 應用程式的預編譯技術。 .NET Native 會直接將你的應用程式編譯成原生程式碼,而非中間語言(IL),以提升效能。 詳情請參見 Compiling Apps with .NET Native

  • .NET Framework Reference Source 提供了全新的瀏覽體驗與增強功能。 你現在可以在線上瀏覽 .NET Framework 原始碼,下載 reference離線查看,並在除錯時逐步瀏覽原始碼(包括修補程式和更新)。 欲了解更多資訊,請參閱部落格文章.NET參考來源的全新外觀

.NET Framework 4.5.1 基礎類別的新功能與增強包括:

Windows Forms 的改進包括:

  • Windows Forms 控制項中的調整大小功能。 您可以使用系統 DPI 設定來調整控制元件的大小(例如,在屬性網格中顯示的圖示),方法是加入應用程式組態檔(app.config)中的條目。 此功能目前支援以下 Windows Forms 控制項:

    要啟用此功能,請在設定檔中新增一個 <appSettings> 元素(app.config),並將該 EnableWindowsFormsHighDpiAutoResizing 元素設定為 true

    <appSettings>
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
    </appSettings>
    

在 Visual Studio 2013 除錯 .NET Framework 應用程式時的改進包括:

  • Visual Studio 除錯器中的回傳值。 當你在 Visual Studio 2013 除錯一個受管理的應用程式時,Autos 視窗會顯示方法的回傳類型和值。 此資訊適用於桌面版、Windows 商店及 Windows Phone 應用程式。 如需詳細資訊,請參閱 檢查方法呼叫的傳回值

  • 64 位應用程式的編輯及繼續功能。 Visual Studio 2013 支援 64 位元管理應用程式的編輯與繼續功能,適用於桌面、Windows 商店及 Windows Phone。 現有的限制對 32 位和 64 位應用程式仍然有效 (請參閱 支援的程式代碼變更 (C#) 文章的最後一節)。

  • 異步感知偵錯。 為了讓 Visual Studio 2013 中非同步應用程式更容易除錯,呼叫堆疊隱藏了編譯器提供的基礎架構程式碼以支援非同步程式設計,並在邏輯父框架中串連,讓你能更清楚地追蹤邏輯程式執行。 [工作] 視窗會取代 [平行工作] 視窗,並顯示與特定中斷點相關的工作,也會顯示應用程式中目前作用中或排程的任何其他工作。 你可以在 .NET Framework 4.5.1 公告的「非同步感知除錯」部分閱讀此功能。

  • 對 Windows Runtime 元件的更好例外支援。 在 Windows 8.1 中,Windows 商店應用程式產生的例外會保留導致該例外的錯誤資訊,即使跨語言界限也能保留。 你可以在 .NET Framework 4.5.1 公告的「Windows Store 應用程式開發」部分閱讀此功能。

從 2013 Visual Studio 開始,你可以使用 Managed Profile Guided Optimization Tool (Mpgo.exe)來優化 Windows 8.x 商店應用程式以及桌面應用程式。

關於 ASP.NET 4.5.1 的新功能,請參見 ASP.NET 及 Web Tools for Visual Studio 2013 版釋出說明

.NET Framework 4.5 新增了什麼

基類

  • 能夠在部署期間偵測並關閉 .NET Framework 4 應用程式,以減少系統重啟。 請參見減少在 .NET Framework 4.5 安裝期間的系統重新啟動

  • 在64位平台上支援大於2 GB的陣列。 可以在應用程式組態檔中啟用此功能。 請參閱<gcAllowVeryLargeObjects>元素,該元素同時列出了對物件大小和陣列大小的其他限制。

  • 透過伺服器背景垃圾回收提升效能。 當你在 .NET Framework 4.5 中使用伺服器垃圾回收時,背景垃圾回收會自動啟用。 請參閱垃圾收集的基本概念主題中的背景伺服器垃圾收集一節。

  • 背景執行的即時編譯(Just-In-Time, JIT),可以選擇地在多核心處理器上使用,以改善應用程式效能。 請參閱 ProfileOptimization

  • 限制正則表達式引擎在逾時之前嘗試解析正則表達式的時間長度。請參閱 Regex.MatchTimeout 屬性。

  • 能夠定義應用程式網域的預設文化特性。 請參閱 CultureInfo 課程。

  • Unicode (UTF-16) 編碼的控制台支援。 請參閱 Console 課程。

  • 支援文化字串排序和比較數據的版本化。 請參閱 SortVersion 課程。

  • 擷取資源時效能更好。 請參閱封裝和部署資源。

  • Zip 壓縮的改進,以減少壓縮檔案的大小。 請參閱 System.IO.Compression 命名空間。

  • 可以自訂反射上下文,以透過 CustomReflectionContext 類別覆蓋預設的反射行為。

  • 當Windows 8 上使用 System.Globalization.IdnMapping 類別時,支援 2008 年版的國際化網域名稱應用(IDNA)標準。

  • 字串比較被委派給支援 Unicode 6.0 的作業系統,當在 Windows 8 上使用 .NET Framework 時。 在其他平台上運行時,.NET 框架包含自己的字串比較資料,實作了 Unicode 5.x。 請參閱 String 類別和 SortVersion 類別的備註部分。

  • 能夠在每個應用程式域計算字串的雜湊碼。 參見 <UseRandomizedStringHashAlgorithm> 元素

  • 類型反射支援分割在 TypeTypeInfo 類別之間。 請參見Windows 商店應用程式中的 .NET Framework 的反射

管理擴展性架構 (MEF)

在 .NET Framework 4.5 中,可管理擴充性框架(Managed Extensibility Framework,MEF)提供了以下新功能:

  • 支援泛型型別。

  • 以慣例為基礎的程式設計模型,可讓您根據命名慣例而非屬性來建立零件。

  • 多個範圍。

  • 這是 MEF 的子集,你可以在建立 Windows 8.x 商店應用程式時使用。 此子集可從 NuGet 資源庫 以 可下載的套件的形式提供。 安裝套件時,請在Visual Studio開啟專案,從Project選單中選擇Manage NuGet Packages,然後在網路上搜尋 Microsoft.Composition套件。

如需詳細資訊,請參閱 受控擴充性架構 (MEF)。

異步檔案作業

在 .NET Framework 4.5 中,C# 和 Visual Basic 語言新增了非同步功能。 這些功能新增了以執行非同步作業為基礎的模型。 若要使用此新模型,請使用 I/O 類別中的非同步方法。 請參閱 非同步檔案 I/O

工具

在 .NET Framework 4.5 中,資源檔案產生器(Resgen.exe)允許您從嵌入在 .NET Framework 組合中的 .resources 檔案,建立用於 Windows 8.x Store 應用程式的 .resw 檔案。 如需詳細資訊,請參閱 Resgen.exe (資源檔案產生器)。

管理的配置檔引導優化(Mpgo.exe)可讓您藉由優化原生映像元件來改善應用程式啟動時間、記憶體使用率(工作集大小)和吞吐量。 命令行工具會產生原生映像應用程式元件的配置檔數據。 請參閱 Mpgo.exe(管理的配置文件引導最佳化工具)。 從 2013 Visual Studio 開始,你可以用 Mpgo.exe 來優化 Windows 8.x 商店應用程式以及桌面應用程式。

平行運算

.NET Framework 4.5 為平行運算提供了多項新功能與改進。 其中包括改進的效能、增強的控制、改進對非同步程式設計的支持、新的資料流庫以及改進對並行偵錯和效能分析的支援。 請參閱 Parallel Programming with .NET 部落格中的 .NET Framework 4.5 平行性的新功能 條目。

網路

ASP.NET 4.5 與 4.5.1 新增了網頁表單的模型綁定、WebSocket 支援、非同步處理器、效能提升及其他多項功能。 如需詳細資訊,請參閱下列資源:

網路

.NET Framework 4.5 為 HTTP 應用程式提供了新的程式介面。 如需詳細資訊,請參閱 new System.Net.HttpSystem.Net.Http.Headers namespace。

此功能也包含支援使用現有的 HttpListener 和相關類別接收及與 WebSocket 連線進行互動的新程式設計介面。 如需詳細資訊,請參閱新的 System.Net.WebSockets 命名空間和 HttpListener 類別。

此外,.NET Framework 4.5 包含以下網路改進:

  • 符合 RFC 規範的 URI 支援。 如需詳細資訊,請參閱 Uri 和 相關類別。

  • 支援國際化網域名稱(IDN)解析。 如需詳細資訊,請參閱 Uri 和 相關類別。

  • 支援電子郵件地址國際化 (EAI)。 如需詳細資訊,請參閱 System.Net.Mail 命名空間。

  • 改進了 IPv6 支持。 如需詳細資訊,請參閱 System.Net.NetworkInformation 命名空間。

  • 雙模式套接字支援。 如需詳細資訊,請參閱 SocketTcpListener 類別。

Windows Presentation Foundation(WPF)

在 .NET Framework 4.5 中,Windows Presentation Foundation(WPF)包含以下領域的變更與改進:

  • 新的 Ribbon 控制件可讓您實現一個包含快速存取工具列、應用程式選單和索引標籤的功能區使用者介面。

  • INotifyDataErrorInfo 介面,支援同步和非同步資料驗證。

  • VirtualizingPanelDispatcher 類別的新功能。

  • 改善顯示大型群組資料集,以及存取非 UI 執行緒上的集合時的效能。

  • 資料繫結至靜態屬性、資料繫結至實作 ICustomTypeProvider 介面的自訂類型,以及從繫結運算式擷取資料繫結資訊。

  • 隨著值的變化重新定位數據(實時整形)。

  • 檢查項目容器的資料內容是否斷線的功能。

  • 能夠設定屬性變更與資料來源更新之間應經過的時間量。

  • 改善對於實作弱事件模式的支援。 此外,事件現在可以接受標籤擴展。

Windows Communication Foundation(WCF)

在 .NET Framework 4.5 中,新增了以下功能,以簡化撰寫與維護 Windows Communication Foundation(WCF)應用程式:

  • 簡化產生的設定檔。

  • 支援契約優先開發。

  • 能夠更輕鬆地設定 ASP.NET 相容模式。

  • 預設傳輸屬性值的變更,旨在減少您需要自行設定它們的可能性。

  • XmlDictionaryReaderQuotas 類別的更新旨在降低您需要手動配置 XML 字典讀取器配額的可能性。

  • 在建置過程中,Visual Studio 會驗證 WCF 設定檔,讓你能在執行應用程式前偵測設定錯誤。

  • 新的非同步串流支援。

  • 新的 HTTPS 協定映射功能,使使用 Internet Information Services(IIS)透過 HTTPS 較容易公開端點。

  • 能夠透過附加 ?singleWSDL 至服務 URL 來在單一 WSDL 文件中產生中繼資料。

  • WebSocket 支援透過連接埠 80 和 443 實現真正的雙向通訊,其效能特性類似於 TCP 傳輸。

  • 支援在程式碼中設定服務。

  • XML 編輯器工具提示。

  • ChannelFactory 快取支援。

  • 二進位編碼器壓縮支援。

  • 支援UDP傳輸,讓開發人員能撰寫使用「發射後即忘」傳訊的服務。 用戶端會將訊息傳送至服務,但預期服務不會回應。

  • 使用 HTTP 傳輸和傳輸安全性時,能夠在單一 WCF 端點上支援多種驗證模式。

  • 支援使用國際化網域名稱(IDN)的 WCF 服務。

欲了解更多資訊,請參閱Windows Communication Foundation最新資訊。

Windows 工作流程基礎(WF)

在 .NET Framework 4.5 中,Windows 工作流程基礎(WF)新增了多項功能,包括:

  • 狀態機工作流程,最初作為 .NET Framework 4.0.1(.NET Framework 4 平台更新 1 的一部分引入。 此更新包括數個新類別和活動,可讓開發人員建立狀態機器工作流程。 這些類別與活動已更新至 .NET Framework 4.5,包含:

    • 在狀態上設定斷點的能力。

    • 在工作流程設計工具中複製和貼上過渡的能力。

    • 設計工具支援共用觸發轉換的建立。

    • 建立狀態機器工作流程的活動,包括:StateMachineStateTransition

  • 增強的工作流程設計工具功能,例如:

    • Visual Studio 中工作流程搜尋功能增強,包括 快速查找Find in Files

    • 當第二個子活動新增至容器活動時,能夠自動建立一個序列活動,並將兩個活動都包含在此序列活動中。

    • 平移支援,可讓工作流程中可見的部分在不使用滾動條的情況下進行變更。

    • 新的 「文件大綱」 檢視,可在樹狀樣式大綱檢視中顯示工作流程的元件,並可讓您在 「檔案大綱」 檢視中選取元件。

    • 能夠將批註新增至活動。

    • 能夠使用工作流程設計工具來定義及取用活動委派。

    • 自動連接和自動插入功能,用於狀態機器和流程圖工作流程中的活動和轉換。

  • 將工作流程的檢視狀態資訊儲存在 XAML 檔案的單一元素中,以便您可以輕鬆地尋找和編輯檢視狀態資訊。

  • NoPersistScope 容器活動,用於防止子活動持久化。

  • 支援 C# 運算式:

    • 使用 Visual Basic 的工作流程專案會使用 Visual Basic 表達式,而 C# 工作流程專案則會使用 C# 表達式。

    • 在 Visual Studio 2010 中建立且使用 Visual Basic 表達式的 C# 工作流程專案,與使用 C# 表達式的 C# 工作流程專案相容。

  • 版本控制增強功能:

    • WorkflowIdentity 類別,提供保存的工作流程執行個體與其工作流程定義之間的對應。

    • 在相同主機中同時執行多個工作流版本,包括 WorkflowServiceHost

    • 在動態更新中,能夠修改保存工作流程執行個體的定義。

  • 合約優先工作流程服務開發,支援自動產生活動以符合現有服務合約。

欲了解更多資訊,請參閱 Windows 工作流程基礎結構的新功能

.NET 用於 Windows 8.x 商店應用程式

Windows 8.x 商店應用程式是針對特定型態設計,並善用 Windows 作業系統的強大功能。 .NET Framework 4.5 或 4.5.1 的子集可用於使用 C# 或 Visual Basic 來建立 Windows 8.x 商店應用程式Windows。 這個子集稱為 .NET,適用於 Windows 8.x Store 應用程式,並在 overview 中討論。

可攜式類別程式庫

Visual Studio 2012(及後續版本)中的可攜式類別庫專案,讓你能夠撰寫並建置可運行於多個 .NET Framework 平台上的託管組件。 透過可攜式類別函式庫專案,你可以選擇目標平台(例如 Windows Phone 和 .NET for Windows 8.x 商店應用程式)。 在您的專案中,可用的類型和成員會自動限制為這些平台上共同使用的類型和成員。 如需詳細資訊,請參閱 可攜式類別庫

另請參閱