將移轉至 .NET Framework 4.7.x 的重定目標變更

本文列出 .NET Framework 4.74.7.14.7.2 中介紹的應用程式相容性問題。

.NET Framework 4.7

ASP.NET

HttpRuntime.AppDomainAppPath 擲回 NullReferenceException

詳細資料

在 .NET Framework 4.6.2 中,執行階段在擷取包含 null 字元的 P:System.Web.HttpRuntime.AppDomainAppPath 值時,會擲回 T:System.NullReferenceException。在 .NET Framework 4.6.1 和更早版本中,執行階段會擲回 T:System.ArgumentNullException

建議

您可以執行下列其中一個動作以回應這項變更︰

  • 如果您的應用程式是在 .NET Framework 4.6.2 上執行,請處理 T:System.NullReferenceException
  • 升級至 .NET Framework 4.7,這可以還原舊版行為並擲回 T:System.ArgumentNullException
名稱
範圍 Edge
版本 4.6.2
類型 正在重定目標

受影響的 API

每一個工作階段的節流閥並行要求數目

詳細資料

在 .NET Framework 4.6.2 和更早版本中,ASP.NET 會使用相同的 Sessionid 循序執行要求,且 ASP.NET 預設一律會透過 Cookie 發出 Sessionid。 如果頁面需要很長的時間來回應,只要在瀏覽器上按 F5 便會大幅降低伺服器效能。 在修正程式中,我們新增了一個計數器來追蹤佇列要求,並在超過指定限制時終止要求。 預設值為 50。 如果達到限制,會在事件記錄檔記錄警告並在 IIS 記錄檔中記錄 HTTP 500 回應。

建議

若要還原舊行為,您可以將下列設定加入您的 web.config 檔案以選擇退出新行為。

<appSettings>
    <add key="aspnet:RequestQueueLimitPerSession" value="2147483647"/>
</appSettings>
名稱
範圍 Edge
版本 4.7
類型 正在重定目標

網路

ServicePointManager.SecurityProtocol 的預設值是 SecurityProtocolType.System.Default

詳細資料

從以 .NET Framework 4.7 為目標的應用程式開始,ServicePointManager.SecurityProtocol 屬性是 SecurityProtocolType.SystemDefault。 這項變更可以讓以 SslStream 為基礎的 .NET Framework 網路 API (例如 FTP、HTTPS 及 SMTP) 繼承作業系統的預設安全性通訊協定,而不要使用由 .NET Framework 定義的硬式編碼值。 預設值會依作業系統和系統管理員執行的任何自訂設定而異。 如需每個 Windows 作業系統版本中預設 SChannel 通訊協定的資訊,請參閱 Protocols in TLS/SSL (Schannel SSP) (TLS/SSL 中的通訊協定 (Schannel SSP))。

目標是舊版 .NET Framework 的應用程式,ServicePointManager.SecurityProtocol 屬性的預設值視目標的 .NET framework 版本而定。 如需詳細資訊,請參閱從 .NET Framework 4.5.2 移轉到 4.6 的重定目標變更的網路區段

建議

這項變更會影響目標為 .NET Framework 4.7 或更新版本的應用程式。 如果您偏好使用定義的通訊協定,而不是依賴系統預設,您可以明確設定 ServicePointManager.SecurityProtocol 屬性的值。 如果不需要此變更,您可以選擇將其退出,方法為將組態設定新增至應用程式組態檔的 <runtime> 區段。 下列範例顯示 <runtime> 區段及 Switch.System.Net.DontEnableSystemDefaultTlsVersions 選擇退出參數:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=true" />
</runtime>
名稱
範圍 Minor
版本 4.7
類型 正在重定目標

受影響的 API

SslStream 支援 TLS 警示

詳細資料

失敗的 TLS 信號交換之後,第一個 I/O 讀取/寫入作業將會擲回 System.IO.IOException 與內部 System.ComponentModel.Win32Exception 例外狀況。 System.ComponentModel.Win32ExceptionSystem.ComponentModel.Win32Exception.NativeErrorCode 程式碼可以使用 TLS 與 SSL 警示適用的 Schannel 錯誤代碼從遠端方對應至 TLS 警示。如需詳細資訊,RFC 2246:第 7.2.2 節錯誤警示
.NET Framework 4.6.2 和更早版本的行為是如果另一方交握失敗,傳輸通道 (通常是 TCP 連線) 會在寫入或讀取期間逾時,並在之後立即拒絕連線。

建議

呼叫網路 I/O API (例如 Read(Byte[], Int32, Int32)/Write(Byte[], Int32, Int32)) 的應用程式,應該處理 IOExceptionSystem.TimeoutException
從 .NET Framework 4.7 開始,預設會啟用 TLS 警示功能。 以 .NET Framework 4.0 到 4.6.2 版為目標且在 .NET Framework 4.7 或更高版本的系統上執行的應用程式,會停用此功能以保留相容性。
若為在 .NET Framework 4.7 或更新版本上執行之 .NET Framework 4.6 和更新版本的應用程式,您可以使用下列組態 API 來啟用或停用此功能。

  • 程式設計方式:必須是應用程式執行的第一件事,因為 ServicePointManager 只會初始化一次:

    AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true);
    
    // Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2.
    AppContext.SetSwitch("Switch.System.Net.DontEnableTlsAlerts", true);
    
  • AppConfig:

    <runtime>
      <AppContextSwitchOverrides value="Switch.System.Net.DontEnableTlsAlerts=true"/>
      <!-- Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. -->
    </runtime>
    
  • 登錄機碼 (電腦全域):將值設為 false,以在 .NET Framework 4.6 - 4.6.2 中啟用功能。

    Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts
    - Type: String
    - Value: "true"
    
名稱
範圍 Edge
版本 4.7
類型 正在重定目標

受影響的 API

安全性

CspParameters.ParentWindowHandle 現在預期有 HWND 值

詳細資料

.NET Framework 2.0 中引進的 ParentWindowHandle 值,可讓應用程式註冊父視窗控制代碼值,因而存取金鑰所需的任何 UI (如 PIN 提示或同意對話方塊) 在指定的視窗會開啟為強制回應子項。從以 .NET Framework 4.7 為目標的應用程式開始,Windows Forms 應用程式可以使用如下的程式碼設定 ParentWindowHandle 屬性:

cspParameters.ParentWindowHandle = form.Handle;

在舊版 .NET Framework 中,值必須為 System.IntPtr,代表存放 HWND 值之記憶體中的位置。 在 Windows 7 和更早版本上,將屬性設為 form.Handle 不會有任何作用,但在 Windows 8 和更新版本上,則會導致「System.Security.Cryptography.CryptographicException:參數不正確。」

建議

以 .NET Framework 4.7 或更新版本為目標的應用程式若要註冊父視窗關聯性,建議使用以下的簡化格式︰

cspParameters.ParentWindowHandle = form.Handle;

使用者如已發現要傳遞的正確值,是 form.Handle 值所在之記憶體位置的位址,則可以藉由將 AppContext 參數 Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle 設為 true 以選擇退出行為變更:

  • 以程式設計方式設定 AppContext 的相容性參數,如這裡所述。
  • 將下列程式行加入至 app.config 檔案的 <runtime> 區段:
<runtime>
 <AppContextSwitchOverrides value="Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle=true"/>
</runtime>

相反地,若使用者想在應用程式在舊版 .NET Framework 下載入時,選擇加入 .NET Framework 4.7 執行階段上的新行為,可以將 AppContext 參數設為 false

名稱
範圍 Minor
版本 4.7
類型 正在重定目標

受影響的 API

SslStream 支援 TLS 警示

詳細資料

失敗的 TLS 信號交換之後,第一個 I/O 讀取/寫入作業將會擲回 System.IO.IOException 與內部 System.ComponentModel.Win32Exception 例外狀況。 System.ComponentModel.Win32ExceptionSystem.ComponentModel.Win32Exception.NativeErrorCode 程式碼可以使用 TLS 與 SSL 警示適用的 Schannel 錯誤代碼從遠端方對應至 TLS 警示。如需詳細資訊,RFC 2246:第 7.2.2 節錯誤警示
.NET Framework 4.6.2 和更早版本的行為是如果另一方交握失敗,傳輸通道 (通常是 TCP 連線) 會在寫入或讀取期間逾時,並在之後立即拒絕連線。

建議

呼叫網路 I/O API (例如 Read(Byte[], Int32, Int32)/Write(Byte[], Int32, Int32)) 的應用程式,應該處理 IOExceptionSystem.TimeoutException
從 .NET Framework 4.7 開始,預設會啟用 TLS 警示功能。 以 .NET Framework 4.0 到 4.6.2 版為目標且在 .NET Framework 4.7 或更高版本的系統上執行的應用程式,會停用此功能以保留相容性。
若為在 .NET Framework 4.7 或更新版本上執行之 .NET Framework 4.6 和更新版本的應用程式,您可以使用下列組態 API 來啟用或停用此功能。

  • 程式設計方式:必須是應用程式執行的第一件事,因為 ServicePointManager 只會初始化一次:

    AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true);
    
    // Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2.
    AppContext.SetSwitch("Switch.System.Net.DontEnableTlsAlerts", true);
    
  • AppConfig:

    <runtime>
      <AppContextSwitchOverrides value="Switch.System.Net.DontEnableTlsAlerts=true"/>
      <!-- Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. -->
    </runtime>
    
  • 登錄機碼 (電腦全域):將值設為 false,以在 .NET Framework 4.6 - 4.6.2 中啟用功能。

    Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts
    - Type: String
    - Value: "true"
    
名稱
範圍 Edge
版本 4.7
類型 正在重定目標

受影響的 API

Windows Communication Foundation (WCF)

DataContractJsonSerializer 的控制字元序列化現在與 ECMAScript V6 和 V8 相容

詳細資料

在 .NET Framework 4.6.2 和更早版本中,System.Runtime.Serialization.Json.DataContractJsonSerializer 不會以相容於 ECMAScript V6 及 V8 標準的方式序列化某些特殊控制字元,例如 \b、\f 和 \t。 從 .NET Framework 4.7 開始,序列化這些控制字元的方式已相容於 ECMAScript V6 和 V8。

建議

若為以 .NET Framework 4.7 為目標的應用程式,會預設啟用此功能。 如果不需要此行為,您可將下列程式行加入至 app.config 或 web.config 檔案的 <runtime> 區段,以選擇退出此功能:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Runtime.Serialization.DoNotUseECMAScriptV6EscapeControlCharacter=false" />
</runtime>
名稱
範圍 Edge
版本 4.7
類型 正在重定目標

受影響的 API

WCF 訊息安全性現在能夠使用 TLS1.1 和 TLS1.2

詳細資料

從 .NET Framework 4.7 開始,除了 SSL3.0 和 TLS1.0 之外,客戶還可以透過應用程式組態設定,在 WCF 訊息安全性設定 TLS1.1 或 TLS1.2。

建議

在 .NET Framework 4.7 中,預設會停用 WCF 訊息安全性中的 TLS1.1 和 TLS1.2 支援。 您可以將下行新增到 app.config 或 web.config 檔案的 <runtime> 區段來啟用它:

<runtime>
<AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols=false;Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
</runtime>
名稱
範圍 Edge
版本 4.7
類型 正在重定目標

Windows Presentation Foundation (WPF)

在具有觸控功能的系統上呼叫 System.Windows.Input.PenContext.Disable 可能會擲回 ArgumentException

詳細資料

在某些情況下,在具有觸控功能的系統上呼叫內部 System.Windows.Intput.PenContext.Disable 方法,可能會擲回由於重新進入而未處理的 T:System.ArgumentException

建議

.NET Framework 4.7 中已解決這個問題。 若要避免這個例外狀況,請升級至從 .NET Framework 4.7 開始的 .NET Framework 版本。

名稱
範圍 Edge
版本 4.6.1
類型 正在重定目標

ImageSourceConverter.ConvertFrom 之例外狀況處理程式碼中的 NullReferenceException

詳細資料

ConvertFrom(ITypeDescriptorContext, CultureInfo, Object) 的例外狀況處理程式碼錯誤已導致擲回不正確的 System.NullReferenceException,而不是預期的例外狀況 (System.IO.DirectoryNotFoundExceptionSystem.IO.FileNotFoundException)。 這項變更會修正該錯誤,讓該方法現在擲回正確的例外狀況。

根據預設,所有以 .NET Framework 4.6.2 和更早版本為目標的應用程式會繼續擲回 System.NullReferenceException 以提供相容性。 以 .NET Framework 4.7 和以上版本為目標的開發人員應該會看到正確的例外狀況。

建議

開發人員若想要在以 .NET Framework 4.7 或更新版本為目標時還原成取得 System.NullReferenceException,可以在其應用程式的 App.config 檔案中新增/合併下列程式碼:

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Media.ImageSourceConverter.OverrideExceptionWithNullReferenceException=true"/>
</runtime>
</configuration>
名稱
範圍 Edge
版本 4.7
類型 正在重定目標

受影響的 API

star-column 空間的 WPF 方格配置

詳細資料

從 .NET Framework 4.7 開始,WPF 取代了 Grid 用來配置 *-column 空間的演算法。 在以下幾種情況下,這會使指派給 *-column 的實際寬度產生變化:

  • 當一或多個 *-column 也具有寬度下限或上限,因而會覆寫該資料行的按比例配置時。 (寬度下限可能衍生自明確的 MinWidth 宣告,或衍生自從資料行的內容取得的隱含下限。寬度上限僅能明確地從 MaxWidth 宣告定義)。
  • 當一或多個 *-column 宣告極大的 *-weight 時 (大於 10^298)。
  • 當 *-weight 的差異足以發生浮點不穩定 (溢位、反向溢位、精確度失準) 時。
  • 當版面配置進位已啟用,且有效顯示 DPI 夠高時。 在前兩個狀況中,新演算法產生的寬度可能明顯不同於舊演算法產生的寬度;在最後一個狀況中,差異最多會是一或兩個像素。

新的演算法修正了舊演算法中的數個錯誤:

  • 資料行的總配置可能會超過方格的寬度。 資料行的按比例共用若低於其大小下限,配置空間時就可能發生這個狀況。 此演算法會配置大小下限,因此,其他資料行的可用空間會減少。 如果沒有要配置的 *-column,總配置將會過大。

  • 總配置的方格寬度可能會不足。 這是第 1 點的雙重問題,在為資料行配置空間時,若其按比例共用超過大小上限,但缺少可使用剩餘空間的 *-column 時,就會發生這個狀況。

  • 兩個 *-column 的配置可能不是依其 *-weight 按比例分配。 相較於第 1 點/第 2 點,這是程度較輕的錯誤,在為 *-columns A、B 和 C (依此順序) 配置空間時,若 B 的按比例共用違反其下限 (或上限) 條件約束,就會發生這個狀況。 如上所述,這會使資料行 C 的可用的空間產生變化,可能會獲得較 A 更少 (或更多) 的比例配置。

  • 權數極大 (> 10^298) 的資料行一律會視為擁有 10 ^298 的權數。 它們之間 (及權數較小的資料行之間) 的比例差異則可忽略。

  • 無法正確處理擁有無限權數的資料行。 (事實上,您無法將權數設為無限大,但這是人為限制。配置程式碼會嘗試處理它,但成效不彰。)

  • 避免溢位、反向溢位時的幾個小問題、精確度失準及類似的浮點數問題。

  • 版面配置進位的調整在 DPI 足夠高的情況下不正確。 新的演算法會產生符合下列準則的結果︰

    • 指派給 *-column 的實際寬度永遠不會低於其寬度下限或高於其寬度上限。
    • 對於尚未指派寬度下限或上限的每個 *-column,會依其 *-weight 按比例指派寬度。 確切而言,若有兩個資料行分別使用寬度 x* 和 y* 宣告,而任一資料行均未配置其寬度下限和上限,則指派給資料行的實際寬度 v 和 w 所使用的比例相同:v / w == x / y。
    • 配置給「按比例」*-column 的總寬度,等於配置給條件約束的資料行 (固定、自動及已配置寬度下限或上限的 *-column) 後的可用空間。 這可能是零,例如,若寬度下限的總和超過方格可用的寬度。
    • 以上所述是就「理想」的版面配置而言。 當版面配置進位作用中時,實際寬度與理想寬度最多會相差一個像素。

注意

本文中有關資料行和寬度的所有內容也適用於資料列和高度。

建議

根據預設,以 .NET Framework 4.7 開始的 .NET Framework 版本為目標的應用程式會看見新的演算法,而以 .NET Framework 4.6.2 或更舊版本為目標的應用程式會看見舊的演算法。

若要覆寫預設值,請使用下列組態設定︰

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>

true 會選取舊的演算法,false 會選取新的演算法。

名稱
範圍 Minor
版本 4.7
類型 正在重定目標

WPF 指標式觸控堆疊

詳細資料

這項變更將能夠啟用選用的 WM_POINTER 式 WPF 觸控/手寫筆堆疊。 開發人員若未明確地啟用此項目,應該不會看到任何 WPF 觸控/手寫筆行為的變更。以下是選用之 WM_POINTER 式觸控/手寫筆堆疊的目前已知問題:

  • 不支援即時筆跡。
  • 雖然筆跡和手寫筆外掛程式還能運作,但它們是在 UI 執行緒上處理,可能會導致效能不佳。
  • 從觸控/手寫筆事件提升為滑鼠事件的變更,因而產生行為變更
  • 操作可能有不同的行為
  • 拖放動作無法對觸控輸入顯示適當的回應
  • 這不影響手寫筆輸入
  • 無法再針對觸控/手寫筆事件起始拖放動作
  • 這可能會導致應用程式停止回應,直到偵測到滑鼠輸入為止。
  • 開發人員應改為從滑鼠事件起始拖放動作。

建議

想要啟用此堆疊的開發人員可以將以下內容新增/合併至其應用程式的 App.config 檔案:

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.EnablePointerSupport=true"/>
</runtime>
</configuration>

移除此項目或將其值設為 false 可關閉這個選用堆疊。請注意,此堆疊僅適用於 Windows 10 Creators Update 和更新版本。

名稱
範圍 Edge
版本 4.7
類型 正在重定目標

Windows Workflow Foundation (WF)

工作流程總和檢查碼從 MD5 變更為 SHA1

詳細資料

為了支援使用 Visual Studio 進行偵錯,工作流程執行階段會使用雜湊演算法為工作流程執行個體產生總和檢查碼。 在 .NET Framework 4.6.2 和更早版本中,工作流程總和檢查碼雜湊使用 MD5 演算法,它會在啟用 FIPS 的系統上造成問題。 從 .NET Framework 4.7 開始,演算法是 SHA1。 如果您的程式碼已保存這些總和檢查碼,就會不相容。

建議

如果您的程式碼因為總和檢查碼失敗而無法載入工作流程執行個體,請嘗試將 AppContext 參數 "Switch.System.Activities.UseMD5ForWFDebugger" 設為 true。在程式碼中:

System.AppContext.SetSwitch("Switch.System.Activities.UseMD5ForWFDebugger", true);

或者,在組態中:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Activities.UseMD5ForWFDebugger=true" />
  </runtime>
</configuration>
名稱
範圍 Minor
版本 4.7
類型 正在重定目標

.NET Framework 4.7.1

ASP.NET

.NET Framework 4.7.1 中的 ASP.NET 協助工具改進功能

詳細資料

從 .NET Framework 4.7.1 開始,ASP.NET 已經改善 ASP.NET Web 控制項如何搭配 Visual Studio 中的協助工具技術,來更妥善支援 ASP.NET 客戶。 這些包括下列變更:

  • 在控制項中,實作遺漏 UI 協助工具模式的變更,例如在 [詳細資料檢視精靈] 的 [新增欄位] 對話方塊或 [ListView 精靈] 的 [設定 ListView] 對話方塊。
  • 改善高對比模式顯示的變更,例如資料頁面巡覽區欄位編輯器。
  • 改善控制項鍵盤瀏覽體驗的變更,例如 DataPager 控制項 [編輯頁面巡覽區欄位精靈] 的 [欄位] 對話方塊、[設定 ObjectContext] 對話方塊,或 [設定資料來源精靈] 的 [設定資料選取項目] 對話方塊。

建議

如何選擇加入或退出這些變更:為了讓 Visual Studio 設計工具可受益於這些變更,它必須在 .NET Framework 4.7.1 或更新版本上執行。 Web 應用程式可以由下列任一種方式受益於這些變更:

  • 安裝 Visual Studio 2017 15.3 或更新版本中,依預設它會以下列 AppContext 參數支援新的協助工具功能。
  • 藉由將 Switch.UseLegacyAccessibilityFeatures AppContext 參數新增到 devenv.exe.config 檔案中的 <runtime> 區段,並將它設定為 false,選擇退出舊版協助工具行為,如下列範例所示。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
...
<!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false'  -->
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
...
</runtime>
</configuration>

以 .NET Framework 4.7.1 或更新版本為目標,並且想要保留舊版協助工具行為的應用程式,可以藉由明確將此 AppContext 參數設為 true,選擇加入舊版的協助工具功能。

名稱
範圍 Minor
版本 4.7.1
類型 正在重定目標

核心

SerialPort 背景執行緒例外狀況

詳細資料

使用 SerialPort 資料流建立的背景執行緒與不會再於擲回 OS 的例外狀況時終止處理序。
在以 .NET Framework 4.7 和舊版為目標的應用程式中,當使用 SerialPort 資料流建立的背景執行緒上擲回作業系統例外狀況時,處理程序會終止。
在目標為 .NET Framework 4.7.1 或更新版本的應用程式中,背景執行緒會等候與作用中的序列連接埠相關且在某些情況下可能會損毀的 OS 事件,例如突然移除序列連接埠。

建議

若為以 .NET Framework 4.7.1 為目標的應用程式,如果不需要例外狀況處理,您可以透過將下列內容新增至 app.config 檔案的 <runtime> 區段以選擇退出例外狀況處理︰

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=true" />
</runtime>

若為以舊版 .NET Framework 為目標但卻在 .NET Framework 4.7.1 或更新版本上執行的應用程式,則可將下列內容新增至 app.config 檔案的 <runtime> 區段,以選擇加入例外狀況處理:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=false" />
</runtime>
名稱
範圍 Minor
版本 4.7.1
類型 正在重定目標

受影響的 API

ServiceBase 不會傳播 OnStart 例外狀況

詳細資料

在 .NET Framework 4.7 和更早版本中,在服務啟動時擲回的例外狀況不會傳播至 ServiceBase.Run 的呼叫端。

從 .NET Framework 4.7.1 為目標的應用程式開始,執行階段會為無法啟動的服務將例外狀況傳播到 ServiceBase.Run

建議

在服務啟動時,如果有例外狀況,將會傳播該例外狀況。 這應該有利於診斷服務無法啟動的情況。

如果不需要此行為,您可以在應用程式組態檔的 runtime 區段中新增下列 AppContextSwitchOverrides 項目,選擇退出:

<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=true" />

如果您的應用程式以比 4.7.1 舊的版本為目標,但您想要有這種行為,請新增下列 AppContextSwitchOverrides 項目至應用程式設定檔的 runtime 區段:

<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=false" />
名稱
範圍 Minor
版本 4.7.1
類型 正在重定目標

受影響的 API

安全性

預設 SignedXML 和 SignedXMS 演算法變更為 SHA256

詳細資料

在 .NET Framework 4.7 和更早版本中,某些作業的 SignedXML 和 SignedCMS 預設為 SHA1。從 .NET Framework 4.7.1 開始,針對這些作業預設會啟用 SHA256。 這項變更是必要的,因為 SHA1 不再被視為是安全的方法。

建議

有兩個新內容參數值可以控制預設使用 SHA1 (不安全) 還是 SHA256:

  • Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms
  • Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms 若為以 .NET Framework 4.7.1 和更新版本為目標的應用程式,如果使用 SHA256 不適當,您可以將預設值還原為 SHA1,方法是新增下列設定參數到應用程式設定檔的 [執行階段] 區段:
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=true;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=true" />

若為以 .NET Framework 4.7.1 和更早版本為目標的應用程式,您可以新增下列設定參數到應用程式設定檔的 runtime 區段,選擇加入此變更:

<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=false;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=false" />
名稱
範圍 Minor
版本 4.7.1
類型 正在重定目標

受影響的 API

SignedXml.GetPublicKey RSACng 會在 net462 (或 lightup) 上傳回 RSACng,而無重定目標變更

詳細資料

從 .NET Framework 4.6.2 開始,SignedXml.GetPublicKey 方法所傳回的物件具象類型 (毫不奇怪地) 從 CryptoServiceProvider 實作變更為 Cng 實作。 這是因為實作從使用 certificate.PublicKey.Key 變更為使用內部 certificate.GetAnyPublicKey,它會轉送給 RSACertificateExtensions.GetRSAPublicKey

建議

從在 .NET Framework 4.7.1 上執行的應用程式開始,您可以使用 .NET Framework 4.6.1 和更早版本中預設使用的 CryptoServiceProvider 實作,方法是將下列設定參數新增至您應用程式設定檔的 runtime 區段:

<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.SignedXmlUseLegacyCertificatePrivateKey=true" />
名稱
範圍 Edge
版本 4.6.2
類型 正在重定目標

受影響的 API

Windows Communication Foundation (WCF)

某些 .NET SDK 工具之改善的協助工具

詳細資料

在 .NET Framework SDK 4.7.1 中,SvcConfigEditor.exe 和 SvcTraceViewer.exe 工具已透過修正不同的協助工具問題而得到改善。 其中大部分是小問題,例如未定義名稱,或未正確實作某些 UI 自動化模式。 雖然許多使用者並未注意到這些不正確的值,但使用螢幕助讀程式等輔助技術的客戶會發現這些 SDK 工具更易於存取。 當然,這些修正程式會變更一些先前的行為,例如鍵盤焦點順序。為了取得這些工具的所有協助工具修正程式,您可以將下列程式碼新增至 app.config 檔案:

<runtime>
  <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false"/>
</runtime>
名稱
範圍 Edge
版本 4.7.1
類型 正在重定目標

Windows Forms

Windows Forms 控制項的協助工具改善

詳細資料

Windows Forms 正在使用協助工具技術改善其運作方式,以便為 Windows Forms 客戶提供更好的支援。 包括自 .NET Framework 4.7.1 開始的下列變更:

  • 改善高對比模式期間之顯示方式的變更。
  • 改善屬性瀏覽器體驗的變更。 屬性瀏覽器改善包括:
  • 透過各種下拉式選取視窗進行更佳的鍵盤導覽。
  • 減少不必要的定位停駐點。
  • 更適當地報告控制項類型。
  • 改善的朗讀程式行為。
  • 在控制項中實作遺漏的 UI 協助工具模式的變更。

建議

如何選擇使用或不使用這些變更為了讓應用程式能受益於這些變更,它必須在 .NET Framework 4.7.1 或更新版本上執行。 應用程式可以用下列任一種方式受益於這些變更:

  • 它已重新編譯為以 .NET Framework 4.7.1 為目標。 在以 .NET Framework 4.7.1 或更新版本為目標的 Windows Forms 應用程式上,預設會啟用這些協助工具變更。
  • 藉由在 app config 檔案的 <runtime> 區段中新增下列 AppContext 參數,並將它設定為 false,選擇退出舊版協助工具行為,如下列範例所示。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
  </startup>
  <runtime>
    <!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false  -->
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
  </runtime>
</configuration>

以 .NET Framework 4.7.1 或更新版本為目標,並且想要保留舊版協助工具行為的應用程式,可以藉由明確將此 AppContext 參數設為 true,選擇加入舊版的協助工具功能。

如需 UI 自動化的概觀,請參閱 UI 自動化概觀

為 UI 自動化模式和屬性新增的支援

協助工具用戶端可以使用通用的公開描述叫用模式,利用新的 WinForms 協助工具功能。 這些不是 WinForms 特有模式。 例如,協助工具用戶端可以在 IAccessible 介面 (MAAS) 上呼叫 QueryInterface 方法,以取得 IServiceProvider 介面。 如果此介面可供使用,用戶端可以使用其 QueryService 方法來要求 IAccessibleEx 介面。 如需詳細資訊,請參閱從用戶端使用 IAccessibleEx。 從 .NET Framework 4.7.1 開始,IServiceProvider 和 IAccessibleEx (若適用) 可供 WinForms 協助工具物件使用。

.NET Framework 4.7.1 為下列 UI 自動化模式和屬性新增支援:

使用高對比佈景主題中作業系統定義的色彩

  • FlatStyle 屬性設定為 FlatStyle.System (這是預設樣式) 的 ButtonCheckBox 控制項,現在使用選取的高對比佈景主題中作業系統定義的色彩。 以往,文字和背景色彩不會呈現對比,因此難以閱讀。
  • Enabled 屬性設定為 falseButtonCheckBoxRadioButtonLabelLinkLabelGroupBox 控制項,使用陰影色彩呈現高對比佈景主題中的文字,導致與背景的對比過低。 現在,這些控制項使用作業系統所定義的「已停用文字」色彩。 此修正套用至 FlatStyle 屬性設定為非 FlatStyle.System 值的控制項。 後者的控制項是由作業系統呈現。
  • DataGridView 現在會於目前焦點所在的儲存格內容周圍呈現可見的矩形。 之前,這不會顯示在特定的高對比佈景主題中。
  • Enabled 屬性設定為 falseToolStripMenuItem 控制項,現在使用作業系統所定義的「已停用文字」色彩。
  • Checked 屬性設定為 trueToolStripMenuItem 控制項,現在以對比的系統色彩呈現相關聯的核取記號。 先前的核取記號色彩對比不足,無法在高對比佈景主題中顯示。 注意:Windows 10 已變更某些高對比系統色彩的值。 Windows Forms 架構是以 Win32 架構為基礎。 為獲得最佳體驗,請在最新版本的 Windows 上執行並選擇採用最新作業系統變更,方法是在測試應用程式中新增 app.manifest 檔案,並取消註解下列程式碼:
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

改善的鍵盤導覽

  • ComboBox 控制項將其 DropDownStyle 屬性設定為 ComboBoxStyle.DropDownList,且它是表單中定位順序的第一個控制項時,如果使用鍵盤來開啟父表單,它現在會顯示焦點矩形。 在這項變更之前,鍵盤焦點是在這個控制項上,但不會呈現焦點指標。

改善的朗讀程式支援

  • MonthCalendar 控制項已針對輔助技術新增存取控制項的支援,包括讓朗讀程式可以讀取先前無法讀取的控制項值。

  • CheckedListBox 控制項現在會於 CheckBox.CheckState 屬性已變更時通知朗讀程式。 之前,朗讀程式不會收到通知,因此使用者不會被告知 CheckState 屬性已更新。

  • LinkLabel 控制項已變更其告知朗讀程式有關控制項文字的方式。 之前,朗讀程式已宣告這段文字兩次,並將 "&" 符號讀取為實際文字,即使使用者看不到這些文字也一樣。 已從朗讀程式宣告中移除重複的文字,以及不必要的 "&" 符號。

  • DataGridViewCell 控制項類型現在會正確地向朗讀程式和其他輔助技術報告唯讀狀態。

  • 朗讀程式現在可以讀取 [Multiple-Document Interface]~/docs/framework/winforms/advanced/multiple-document-interface-mdi-applications.md) 應用程式中的子視窗系統功能表。

  • 朗讀程式現在可以讀取 ToolStripItem.Enabled 屬性設定為 falseToolStripMenuItem 控制項。 之前,朗讀程式無法將焦點放在已停用的功能表項目來讀取內容。

名稱
範圍 主修
版本 4.8
類型 正在重定目標

受影響的 API

Windows Presentation Foundation (WPF)

WPF 的協助工具改善

詳細資料

高對比改善

  • 現在會顯示 Expander 控制項的焦點。 在舊版 .NET Framework 中並非如此。
  • CheckBoxRadioButton 控制項在選取時,其中的文字現在比起舊版 .NET Framework 更容易查看。
  • 已停用 ComboBox 的框線現在與已停用文字的色彩相同。 在舊版 .NET Framework 中並非如此。
  • 已停用和聚焦按鈕現在會使用正確的佈景主題色彩。 在舊版 .NET Framework 中並非如此。
  • ComboBox 控制項的樣式設定為 ToolBar.ComboBoxStyleKey 時,現在會顯示下拉式按鈕。 在舊版 .NET Framework 中並非如此。
  • DataGrid 控制項中的排序指標箭號現在會使用佈景主題色彩。 在舊版 .NET Framework 中並非如此。
  • 預設的超連結樣式現在會在滑鼠移至上方時變更為正確的佈景主題色彩。 在舊版 .NET Framework 中並非如此。
  • 現在會顯示選項按鈕上的鍵盤焦點。 在舊版 .NET Framework 中並非如此。
  • DataGrid 控制項的核取方塊資料行現在會使用鍵盤焦點回饋的預期色彩。 在舊版 .NET Framework 中並非如此。
  • 鍵盤焦點視覺效果現在會顯示在 ComboBoxListBox 控制項上。 在舊版 .NET Framework 中並非如此。

螢幕助讀程式互動改善

  • 螢幕助讀程式現在會將 Expander 控制項正確宣告為群組 (展開/摺疊)。
  • 螢幕助讀程式現在會將 DataGridCell 控制項正確宣告為資料儲存格 (展開/摺疊)。
  • 螢幕助讀程式現在會宣告可編輯 ComboBox 的名稱。
  • PasswordBox 控制項不再由螢幕助讀程式宣告為「檢視中無任何項目」。

LiveRegion 支援

螢幕助讀程式 (例如朗讀程式) 可協助人們了解應用程式的使用者介面 (UI),通常藉由描述目前具有焦點的 UI 元素。 不過,如果螢幕某處的 UI 項目變更,而且沒有焦點,則使用者可能不會收到通知,並且可能會遺失重要資訊。 LiveRegions 旨在用來解決這個問題。 開發人員可以使用它們來通知螢幕助讀程式或任何其他 UI 自動化用戶端,已對 UI 項目進行重要變更。 螢幕助讀程式接著可以決定如何和何時通知使用者已進行這項變更。 LiveSetting 屬性還可讓螢幕助讀程式知道通知使用者 UI 所做變更的重要性。

建議

如何選擇加入或退出這些變更

若要讓應用程式受益於這些變更,您必須在 .NET Framework 4.7.1 或更新版本上執行應用程式。 應用程式可以用下列任一種方式受益於這些變更:

  • 目標 .NET Framework 4.7.1。 這是建議的處理方式。 在以 .NET Framework 4.7.1 或更新版本為目標的 WPF 應用程式上,預設會啟用這些協助工具變更。

  • 藉由在 app config 檔案的 <runtime> 區段中新增下列 AppContext 參數,並將它設定為 false,選擇退出舊版協助工具行為,如下列範例所示。

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
      </startup>
      <runtime>
        <!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false'  -->
        <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
      </runtime>
    </configuration>
    

以 .NET Framework 4.7.1 或更新版本為目標,並且想要保留舊版協助工具行為的應用程式,可以藉由明確將此 AppContext 參數設為 true,選擇使用舊版的協助工具功能。 如需 UI 自動化的概觀,請參閱 UI 自動化概觀

名稱
範圍 主修
版本 4.7.1
類型 正在重定目標

受影響的 API

Selector 的 SelectionChanged 事件和 SelectedValue 屬性

詳細資料

從 .NET Framework 4.7.1 開始,Selector 在其選取項目變更時,一律會先更新其 SelectedValue 屬性的值,再引發 SelectionChanged 事件。 這會讓 SelectedValue 屬性與其他的選取項目屬性一致 (SelectedItemSelectedIndex),它們會在引發事件前予以更新。

在 .NET Framework 4.7 和舊版中,在大部分情況下,更新 SelectedValue 會發生在事件之前,但如果選取項目變更是由於變更 SelectedValue 屬性所造成,則會發生在事件之後。

建議

以 .NET Framework 4.7.1 或更新版本為目標的應用程式可透過在應用程式組態檔的 <runtime> 區段中新增下列內容來選擇退出此變更,並使用舊版行為:

<runtime>
<AppContextSwitchOverrides
value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=true" />
</runtime>

以 .NET Framework 4.7 或舊版為目標但在 .NET Framework 4.7.1 或更新版本上執行的應用程式,只要在應用程式組態檔的 <runtime> 區段新增下列程式行,就能啟用新行為:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=false" />
</runtime>
名稱
範圍 Minor
版本 4.7.1
類型 正在重定目標

受影響的 API

TabControl SelectionChanged 事件和 SelectedContent 屬性

詳細資料

從 .NET Framework 4.7.1 開始,TabControl 會在其選取項目變更時先更新其 SelectedContent 屬性的值,再引發 SelectionChanged 事件。在 .NET Framework 4.7 和舊版中,更新 SelectedContent 發生在事件之後。

建議

以 .NET Framework 4.7.1 或更新版本為目標的應用程式可透過在應用程式組態檔的 <runtime> 區段中新增下列內容來選擇退出此變更,並使用舊版行為:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=true" />
</runtime>

以 .NET Framework 4.7 或舊版為目標但在 .NET Framework 4.7.1 或更新版本上執行的應用程式,只要在應用程式組態檔的 <runtime> 區段新增下列程式行,就能啟用新行為:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=false" />
</runtime>
名稱
範圍 Minor
版本 4.7.1
類型 正在重定目標

受影響的 API

WPF PackageDigitalSignatureManager 的預設雜湊演算法現在是 SHA256

詳細資料

System.IO.Packaging.PackageDigitalSignatureManager 提供與 WPF 套件相關的數位簽章功能。 在 .NET Framework 4.7 和舊版中,用來簽署套件各部分的預設演算法 (PackageDigitalSignatureManager.DefaultHashAlgorithm) 是 SHA1。 由於最新的 SHA1 安全性考量之故,這個預設值從 .NET Framework 4.7.1 開始已變更為 SHA256。 這項變更會影響所有套件簽署,包括 XPS 文件。

建議

開發人員若想要在目標設為低於 .NET Framework 4.7.1 的 Framework 版本時利用這項變更,或在目標設為 .NET Framework 4.7.1 或更高版本時使用先前的功能,可以適當地設定下列 AppContext 旗標。 true 值會導致使用 SHA1 作為預設演算法;false 值則導致使用 SHA256。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.UseSha1AsDefaultHashAlgorithmForDigitalSignatures=true"/>
</runtime>
</configuration>
名稱
範圍 Edge
版本 4.7.1
類型 正在重定目標

受影響的 API

Windows Workflow Foundation (WF)

Windows Workflow Foundation (WF) 工作流程設計工具中的協助工具改善

詳細資料

Windows Workflow Foundation (WF) 工作流程設計工具正在使用協助工具技術改善其運作方式。 這些改善包括下列變更:

  • 在某些控制項中,定位順序變更為由左至右及由上至下:
  • 設定 InitializeCorrelation 活動之關聯性資料的初始化關聯性視窗
  • ReceiveSendSendReplyReceiveReply 活動的內容定義視窗
  • 可透過鍵盤使用多個功能:
  • 編輯活動的屬性時,如果第一次將焦點放在屬性群組,可以透過鍵盤將其摺疊。
  • 現在可透過鍵盤存取警告圖示。
  • 現在可透過鍵盤存取 [屬性] 視窗中的 [其他屬性] 按鈕。
  • 鍵盤使用者現在可以存取工作流程設計工具之 [引數] 和 [變數] 窗格中的標頭項目。
  • 在以下這類情況發生時,已改善具有焦點之項目的可見性:
  • 在工作流程設計工具與活動設計工具所使用的資料格中新增資料列。
  • 使用 Tab 鍵循環顯示 ReceiveReplySendReply 活動的欄位。
  • 設定變數或引數的預設值
  • 螢幕助讀程式現在可以正確辨識:
  • 工作流程設計工具中設定的中斷點。
  • FlowSwitch<T>FlowDecisionCorrelationScope 活動。
  • Receive 活動的內容。
  • InvokeMethod 活動的目標類型。
  • TryCatch 活動中的例外狀況下拉式方塊和 Finally 區段。
  • 傳訊活動 (ReceiveSendSendReplyReceiveReply) 中的 [訊息類型] 下拉式方塊、[新增關聯性初始設定式] 視窗、[內容定義] 視窗和 [CorrelatesOn 定義] 視窗。
  • 狀態機器轉換和轉換目的地。
  • FlowDecision 活動的註釋和連接器。
  • 活動的操作 (右鍵) 功能表。
  • 屬性方格中的屬性值編輯器、[清除搜尋] 按鈕、[依分類] 及 [字母順序] 排序按鈕和 [運算式編輯器] 對話方塊。
  • 工作流程設計工具中的顯示比例百分比。
  • ParallelPick 活動中的分隔符號。
  • InvokeDelegate 活動。
  • 字典活動 (Microsoft.Activities.AddToDictionary<TKey,TValue>Microsoft.Activities.RemoveFromDictionary<TKey,TValue> 等) 的 [選取類型] 視窗。
  • [瀏覽並選取 .NET 類型] 視窗。
  • 工作流程設計工具中的階層連結。
  • 選擇高對比佈景主題的使用者會看到工作流程設計工具和其控制項在可見性方面的許多改善,例如項目之間的更佳對比比例以及用於焦點項目的更明顯選取方塊。

建議

如果您使用已重新裝載工作流程設計工具的應用程式,藉由執行上述其中一個動作,您的應用程式可以受益於這些變更:

  • 重新編譯應用程式,使其以 .NET Framework 4.7.1 為目標。 預設會啟用這些協助工具變更。
  • 應用程式若以 .NET Framework 4.7 或舊版為目標,但卻在 .NET Framework 4.7.1 上執行,您可以在 app.config 檔案的 <runtime> 區段中新增下列 AppContext 參數,並將它設定為 false,選擇退出這些舊版協助工具行為,如下列範例所示。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
  </startup>
  <runtime>
    <!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false  -->
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
  </runtime>
</configuration>

以 .NET Framework 4.7.1 或更新版本為目標,並且想要保留舊版協助工具行為的應用程式,可以藉由明確將此 AppContext 參數設為 true,選擇加入舊版的協助工具功能。

名稱
範圍 Minor
版本 4.7.1
類型 正在重定目標

.NET Framework 4.7.2

核心

允許在 URI 中使用 Unicode 雙向控制字元

詳細資料

Unicode 會指定數個特殊控制字元,用來指定文字的方向。 在舊版的 .NET Framework 中,這些字元會從所有 URI 中不正確地移除,即使它們存在於自己的百分比編碼中。 為進一步遵循 RFC 3987,我們現在允許在 URI 中使用這些字元。 在 URI 找到未編碼的內容時,它們是百分比編碼的。 找到百分比編碼的內容時,它們會保持現況。

建議

以 .NET Framework 4.7.2 版開始為目標的應用程式,預設啟用對 Unicode 雙向字元的支援。 如果不需要這項變更,您可以在應用程式組態檔的 <runtime> 區段中新增下列 AppContextSwitchOverrides 參數來停用此變更:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters=true" />
</runtime>

對於以舊版 .NET Framework 為目標,但執行版本低於 .NET Framework 4.7.2 (含) 的應用程式,預設停用對 Unicode 雙向字元的支援。 您可以在應用程式組態檔的 <runtime> 區段中新增下列 AppContextSwitchOverrides 參數停用它:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters=false" />
</runtime>
名稱
範圍 Minor
版本 4.7.2
類型 正在重定目標

受影響的 API

DeflateStream 使用原生 API 解壓縮

詳細資料

從 .NET Framework 4.7.2 開始,T:System.IO.Compression.DeflateStream 類別中的解壓縮實作已變更為預設使用原生 Windows API。 一般而言,這會導致顯著的效能改善。 所有以 .NET Framework 4.7.2 或更高版本為目標的 .NET 應用程式都會使用原生實作。這項變更可能會導致行為的某些差異,包括:

  • 例外狀況訊息可能會不同。 不過,擲回的例外狀況類型維持不變。
  • 某些特殊情況下,例如記憶體不足無法完成作業,可能會以不同的方式處理。
  • 剖析 gzip 標頭的已知差異 (注意:只有針對解壓縮設定的 GZipStream 會受到影響):
  • 剖析無效標頭時的例外狀況,可能會在不同的時間擲回。
  • 原生實作強制執行的 gzip 標頭內某些保留旗標值 (亦即 FLG),會根據規格設定,這可能會造成它擲回略過先前無效值的例外狀況。

建議

如果使用原生 API 解壓縮對您的應用程式行為有不良影響,您可以在 app.config 檔案的 runtime 區段中新增 Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression 參數,並將它設定為 true,選擇不使用這項功能:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression=true" />
  </runtime>
</configuration>
名稱
範圍 Minor
版本 4.7.2
類型 正在重定目標

受影響的 API

確定 System.Uri 使用一致的保留字集

詳細資料

System.Uri 中,某些有時已解碼的百分比編碼字元,現在一致保持編碼。 這發生在存取 URI 的路徑、查詢、片段或使用者資訊元件的屬性和方法之間。 行為只有在下列兩項都符合時才會變更:

  • URI 包含下列任一保留字元的編碼格式::'()!*
  • URI 包含 Unicode 或編碼的非保留字元。 如果符合上述兩項,則編碼的保留字元會保持編碼。 在舊版的 .NET Framework 中,它們是解碼的。

建議

對於以 .NET Framework 4.7.2 版開始為目標的應用程式,預設會啟用新的解碼行為。 如果不需要這項變更,您可以在應用程式組態檔的 <runtime> 區段中新增下列 AppContextSwitchOverrides 參數來停用此變更:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=true" />
</runtime>

對於以舊版 .NET Framework 為目標,但執行版本低於 .NET Framework 4.7.2 (含) 的應用程式,預設會停用新的解碼行為。 您可以在應用程式組態檔的 <runtime> 區段中新增下列 AppContextSwitchOverrides 參數停用它:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=false" />
</runtime>
名稱
範圍 Minor
版本 4.7.2
類型 正在重定目標

受影響的 API

Resgen 拒絕從 Web 載入內容

詳細資料

.resx 檔案可能包含二進位格式輸入。 如果您嘗試使用 Resgen 載入從不受信任位置下載的檔案,則預設無法載入輸入。

建議

需要從不受信任位置載入二進位格式輸入的 Resgen 使用者可以從輸入檔中移除 Web 標記,或套用退出 Quirk。新增下列登錄設定以套用全電腦的退出 Quirk:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\SDK] "AllowProcessOfUntrustedResourceFiles"="true"

名稱
範圍 Edge
版本 4.7.2
類型 正在重定目標

使用可攜式 PDB 時取得的堆疊追蹤,現已包含來源檔案與程式碼資訊 (若要求)

詳細資料

從 .NET Framework 4.7.2 開始,如果要求,使用可攜式 PDB 時取得的堆疊追蹤會包含來源檔案與程式碼資訊。 在 .NET Framework 4.7.2 之前的版本中,即使明確要求,使用可攜式 PDB 時也無法取得來源檔案和程式碼資訊。

建議

若為以 .NET Framework 4.7.2 為目標的應用程式,如果不需要,您可以透過將下列內容新增至 app.config 檔案的 <runtime> 區段,選擇使用可攜式 PDB 時不包含來源檔案和程式碼資訊︰

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=true" />
</runtime>

若為以舊版 .NET Framework 為目標但卻在 .NET Framework 4.7.2 或更新版本上執行的應用程式,則可將下列內容新增至 app.config 檔案的 <runtime> 區段,選擇使用可攜式 PDB 時包含來源檔案和程式碼資訊︰

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=false" />
</runtime>
名稱
範圍 Edge
版本 4.7.2
類型 正在重定目標

受影響的 API

Windows Forms

已改進 .NET 4.7.2 之 Windows Forms 控制項的協助工具

詳細資料

Windows Forms Framework 利用了協助工具技術改善其運作方式,可為 Windows Forms 客戶提供更良好的支援。 這些包括下列變更:

  • 改善高對比模式期間之顯示方式的變更。
  • 在 DataGridView 與 MenuStrip 控制項中進行了改進鍵盤瀏覽的變更。
  • 對朗讀程式的互動進行了變更。

建議

如何選擇使用或不使用這些變更為了讓應用程式能受益於這些變更,它必須在 .NET Framework 4.7.2 或更新版本上執行。 應用程式可以用下列任一種方式受益於這些變更:

  • 將其重新編譯為以 .NET Framework 4.7.2 為目標。 在以 .NET Framework 4.7.2 或更新版本為目標的 Windows Forms 應用程式上,預設會啟用這些協助工具的變更。
  • 其以 .NET Framework 4.7.1 或更新版本為目標,且藉由在應用程式組態檔的 <runtime> 區段中新增下列 AppContext 參數,並將其設定為 false,選擇不使用舊版協助工具行為,如下範例所示。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
  </startup>
  <runtime>
    <!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false  -->
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false" />
  </runtime>
</configuration>

請注意,選擇使用 .NET Framework 4.7.2 中新增的協助工具功能時,也必須選擇使用 .NET Framework 4.7.1 的協助工具功能。 以 .NET Framework 4.7.2 或更新版本為目標,並且想要保留舊版協助工具行為的應用程式,可以藉由明確將此 AppContext 參數設為 true,選擇使用舊版的協助工具功能。

使用高對比佈景主題中作業系統定義的色彩

  • ToolStripDropDownButton 的下拉式箭號現在會於高對比佈景主題中使用 OS 所定義的色彩。
  • 若有選取時,其 FlatStyle 設定為 FlatStyle.FlatFlatStyle.PopupButtonRadioButtonCheckBox 控制項,現已會於高對比佈景主題中使用 OS 所定義的色彩。 以往,文字和背景色彩不會呈現對比,因此難以閱讀。
  • GroupBox 中其 Enabled 屬性設定為 false 的控制項,現已會於高對比佈景主題中使用 OS 所定義的色彩。
  • 控制項 ToolStripButtonToolStripComboBoxToolStripDropDownButton 在高對比模式下有更高的亮度對比率。
  • DataGridViewLinkCell 預設會為 DataGridViewLinkCell.LinkColor 屬性在高對比模式下使用 OS 所定義的色彩。 注意:Windows 10 已變更某些高對比系統色彩的值。 Windows Forms 架構是以 Win32 架構為基礎。 為獲得最佳體驗,請在最新版本的 Windows 上執行並選擇採用最新作業系統變更,方法是在測試應用程式中新增 app.manifest 檔案,並取消註解下列程式碼:
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

改善的朗讀程式支援

已改進 DataGridView 協助工具支援

已改進視覺提示

已改進屬性方格支援

名稱
範圍 主修
版本 4.7.2
類型 正在重定目標

在巢狀 ToolStripMenuItems 的情況下,ContextMenuStrip.SourceControl 屬性包含有效的控制項

詳細資料

在 .NET Framework 4.7.1 和舊版本中,當使用者從巢狀 ToolStripMenuItem 控制項開啟功能表時,ContextMenuStrip.SourceControl 屬性會誤傳回 null。 在 .NET Framework 4.7.2 和更新版本中,一律會將 SourceControl 屬性設定為實際的來源控制項。

建議

如何選擇使用或不使用這些變更為了讓應用程式能受益於這些變更,您必須在 .NET Framework 4.7.2 或更新版本上執行應用程式。 應用程式可以用下列任一種方式受益於這些變更:

  • 以 .NET Framework 4.7.2 為目標。 在以 .NET Framework 4.7.2 或更新版本為目標的 Windows Forms 應用程式上,預設會啟用這項變更。
  • 以 .NET Framework 4.7.1 或舊版為目標,並選擇不使用舊版協助工具行為;方法為在 app.config 檔的 <runtime> 區段中新增下列 AppContext 參數,並將其設定為 false,如下範例所示。
<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue=false"/>
</runtime>

如果應用程式是以 .NET Framework 4.7.2 或更新版本為目標,而您想要保留舊版的行為,則可以明確將此 AppContext 參數設為 true,選擇使用舊版的來源控制項。

名稱
範圍 Edge
版本 4.7.2
類型 正在重定目標

受影響的 API

PrivateFontCollection.AddFontFile 方法會釋放字型資源

詳細資料

在 .NET Framework 4.7.1 和舊版本中,如果 Font 物件是使用 AddFontFile(String) 方法新增至這個集合,則 System.Drawing.Text.PrivateFontCollection 類別不會在處置物件的 PrivateFontCollection 之後釋放 GDI+ 字型資源。 在 .NET Framework 4.7.2 和更新版本中,Dispose 會釋放已藉由檔案形式新增至集合中的 GDI+ 字型。

建議

如何選擇使用或不使用這些變更為了讓應用程式能受益於這些變更,您必須在 .NET Framework 4.7.2 或更新版本上執行應用程式。 應用程式可以用下列任一種方式受益於這些變更:

  • 將其重新編譯為以 .NET Framework 4.7.2 為目標。 在以 .NET Framework 4.7.2 或更新版本為目標的 Windows Forms 應用程式上,預設會啟用這項變更。
  • 以 .NET Framework 4.7.1 或舊版為目標,並選擇不使用舊版協助工具行為;方法為在 app.config 檔的 <runtime> 區段中新增下列 AppContext 參數,並將其設定為 false,如下範例所示。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Drawing.Text.DoNotRemoveGdiFontsResourcesFromFontCollection=false"/>
</runtime>

如果應用程式是以 .NET Framework 4.7.2 或更新版本為目標,而您想要保留舊版本的行為,則可以明確將此 AppContext 參數設為 true,選擇不要釋放字型資源。

名稱
範圍 Edge
版本 4.7.2
類型 正在重定目標

受影響的 API

WinForm 的網域 upbutton 和 downbutton 動作現在會同步

詳細資料

在 .NET Framework 4.7.1 和先前版本中,DomainUpDown 控制項的 DomainUpDown.UpButton() 動作會在控制項文字存在時予以忽略,因此開發人員必須在控制項上使用 DomainUpDown.DownButton() 動作,才能使用 DomainUpDown.UpButton() 動作。 從 .NET Framework 4.7.2 開始,DomainUpDown.UpButton()DomainUpDown.DownButton() 這兩個動作在此案例中會獨立工作,並保持同步。

建議

為了讓應用程式可受益於這些變更,它必須在 .NET Framework 4.7.2 或更新版本上執行。 應用程式可以用下列任一種方式受益於這些變更:

  • 將其重新編譯為以 .NET Framework 4.7.2 為目標。 在以 .NET Framework 4.7.2 或更新版本為目標的 Windows Forms 應用程式上,預設會啟用這項變更。
  • 藉由在應用程式組態檔的 <runtime> 區段中新增下列 AppContext 參數,並將它設定為 false,選擇退出舊版捲動行為,如下列範例所示。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling=false"/>
</runtime>
名稱
範圍 Edge
版本 4.7.2
類型 正在重定目標

受影響的 API

Windows Presentation Foundation (WPF)

鍵盤焦點現在可在 WinForms/WPF 裝載的多個圖層中正確移動

詳細資料

請考慮裝載 WinForms 控制項的 WPF 應用程式,此控制項因此會裝載 WPF 控制項。 如果該圖層中的第一個或最後一個控制項是 WPF System.Windows.Forms.Integration.ElementHost,使用者可能無法使用 Tab 離開 WinForms 圖層。 這項變更會修正此問題,而且使用者現在可以使用 Tab 離開 WinForms 圖層。依賴焦點的自動化應用程式絕不會逸出可能不再如預期運作的 WinForms 圖層。

建議

至於以低於 .NET Framework 4.7.2 版本為目標,又想要利用這項變更的開發人員,可以將下列 AppContext 旗標集合設為 false,以啟用變更。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false"/>
</runtime>
</configuration>

WPF 應用程式必須選擇所有早期的協助工具改善,才能取得更新版本的增強功能。 換句話說,Switch.UseLegacyAccessibilityFeaturesSwitch.UseLegacyAccessibilityFeatures.2 參數都必須是以 .NET 4.7.2 或更新版本為目標且需要先前功能的 setA 開發人員,其可將下列的 AppContext 旗標設為 true,才能停用變更。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true"/>
</runtime>
</configuration>
名稱
範圍 Edge
版本 4.7.2
類型 正在重定目標

現在,WPF 標記編譯器的預設雜湊演算法是 SHA256

詳細資料

WPF 標記編譯器提供 XAML 標記檔案的編譯服務。 在 .NET Framework 4.7.1 和舊版本中,用於總和檢查碼的預設演算法是 SHA1。 但由於最近對 SHA1 產生的安全性顧慮,因此從 .NET Framework 4.7.2 開始,這個預設已變更為 SHA256。 這項變更會影響標記檔案在編譯期間產生的所有總和檢查碼。

建議

如果開發人員是以 .NET Framework 4.7.2 或更新版本為目標,並想還原到 SHA1 雜湊行為,則必須設定下列 AppContext 旗標。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Markup.DoNotUseSha256ForMarkupCompilerChecksumAlgorithm=true"/>
</runtime>
</configuration>

如果開發人員想要利用 SHA256 雜湊,同時以 .NET 4.7.2 以下的 Framework 版本為目標,則必須設定下列 AppContext 旗標。 請注意,安裝的 .NET Framework 版本必須為 4.7.2 或更新版本。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Markup.DoNotUseSha256ForMarkupCompilerChecksumAlgorithm=false"/>
</runtime>
</configuration>
名稱
範圍 透明
版本 4.7.2
類型 正在重定目標

WPF AppDomain 關閉處理現在可能會在清除弱式事件時呼叫 Dispatcher.Invoke

詳細資料

在 .NET Framework 4.7.1 和更早版本中,WPF 可能會在 AppDomain 關閉期間於 .NET 完成項執行緒上建立 System.Windows.Threading.Dispatcher。 此問題已在 .NET Framework 4.7.2 和更新版本中修正,方法為清除弱式事件執行緒感知。 因此,WPF 可能會呼叫 Dispatcher.Invoke 以完成清除處理序。在某些應用程式中,完成項計時中的這項變更可能會在 AppDomain 或處理序關閉期間造成例外狀況。 在處理序或 AppDomain 關閉之前,應用程式若未正確關閉背景工作執行緒上執行的 Dispatcher,通常就會看到此情況。 這類應用程式應該謹慎,以適當地管理 Dispatcher 的存留期。

建議

在 .NET Framework 4.7.2 和更新版本中,開發人員可以停用此修正程式,以協助減輕 (但不會消除) 由於清除變更而可能發生的計時問題。若要停用清除中的變更,請使用下列 AppContext 旗標。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotInvokeInWeakEventTableShutdownListener=true"/>
</runtime>
</configuration>
名稱
範圍 Edge
版本 4.7.2
類型 正在重定目標

WPF 在主要/詳細資料案例中顯示 ADO 資料時會變更主索引鍵

詳細資料

假設您有 Order 類型的 ADO 項目集合,並具有名為 OrderDetails 的關係,透過主索引鍵 "OrderID" 將它與 Detail 類型的項目集合相關聯。 在 WPF 應用程式中,您可以將清單控制項繫結到指定訂單的詳細資料:

<ListBox ItemsSource="{Binding Path=OrderDetails}" >

其中 DataContext 是 Order。 WPF 會取得 OrderDetails 屬性的值 - 所有 Detail 項目的集合 D,其 OrderID 符合主項目的 OrderID。 當變更主項目的主索引鍵 OrderID 時,就會引發行為變更。 ADO 會自動變更 Details 集合中每個受影響記錄的 OrderID (也就是複製到集合 D 的項目)。 但 D 會發生什麼情況?

  • 舊的行為:系統會清除集合 D。 主要項目不會針對屬性 OrderDetails 引發變更通知。 ListBox 會繼續使用集合 D (它現在是空的)。
  • 新的行為:系統不會變更集合 D。 其每個項目都會針對 OrderID 屬性引發變更通知。 ListBox 會繼續使用集合 D,並以新的 OrderID 來顯示詳細資料。 WPF 會透過以不同的方式建立集合 D 來實作新的行為,也就是搭配將 followParent 引數設定為 true 來呼叫 ADO 方法 DataRowView.CreateChildView(DataRelation, Boolean)

建議

應用程式能透過使用下列 AppContext 參數來取得新的行為。

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Data.DoNotUseFollowParentWhenBindingToADODataRelation=false"/>
  </runtime>
</configuration>

針對以 .NET 4.7.1 或更舊版本為目標的應用程式,此參數的預設值為 true (舊行為),而針對以 .NET 4.7.2 或更新版本為目標的應用程式,預設值則為 false (新行為)。

名稱
範圍 Minor
版本 4.7.2
類型 正在重定目標

現在,當控制項沒有內容時,RadioButton 和 CheckBox 的 WPF 焦點視覺效果會正確顯示

詳細資料

在 .NET Framework 4.7.1 和舊版的傳統和高對比佈景主題中,WPF System.Windows.Controls.CheckBoxSystem.Windows.Controls.RadioButton 的焦點視覺效果不一致且不正確。 當控制項沒有任何內容集時,會發生上述問題。 這可能會讓人混淆佈景主題之間的轉換,也看不清楚焦點視覺效果。 現在,.NET Framework 4.7.2 的這些視覺效果在各佈景主題之間會更一致;在傳統和高對比佈景主題中也可以看得更清楚。

建議

如果開發人員是以 .NET Framework 4.7.2 為目標,並想要還原為 .NET 4.7.1 的行為,則必須設定下列 AppContext 旗標。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true;"/>
</runtime>
</configuration>

如果開發人員想要利用這項變更,同時以 .NET 4.7.2 以下的 Framework 版本為目標,則必須設定下列 AppContext 旗標。請注意,所有旗標都必須正確設定,而且安裝的 .NET Framework 版本必須為 4.7.2 或更新版本。您必須具備 WPF 應用程式,才能選擇使用所有舊版的協助工具改進功能,並取得最新的改進功能。 若要這樣做,請確認 'Switch.UseLegacyAccessibilityFeatures' 和 'Switch.UseLegacyAccessibilityFeatures.2' 這兩個 AppContext 參數均設為 false。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;"/>
</runtime>
</configuration>
名稱
範圍 Edge
版本 4.7.2
類型 正在重定目標

WPF 文字方塊/PasswordBox 文字選取範圍不遵循系統色彩

詳細資料

在 .NET Framework 4.7.1 和舊版中,WPF System.Windows.Controls.TextBoxSystem.Windows.Controls.PasswordBox 只能在 Adorner 圖層轉譯文字選取項目。 在某些系統佈景主題中,這會遮擋文字,讓它變得更難讀取。 在 .NET Framework 4.7.2 和更新版本中,開發人員可以選擇非 Adorner 型的選取項目轉譯配置來減輕這個問題。

建議

想要利用這項變更的開發人員必須適當設定下列 AppContext 旗標。 若要利用這項功能,已安裝的 .NET Framework 版本必須是 4.7.2 或更高。若要啟用非 Adorner 型的選取項目,請使用下列 AppContext 旗標。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering=false"/>
</runtime>
</configuration>
名稱
範圍 Edge
版本 4.7.2
類型 正在重定目標

Windows Workflow Foundation (WF)

避免 IWorkflowInstanceManagement.TransactedCancel 與 IWorkflowInstanceManagement.TransactedTerminate 的無止盡遞迴

詳細資料

在某些情況下,若使用 IWorkflowInstanceManagement.TransactedCancelIWorkflowInstanceManagement.TransactedTerminate API 取消或終止工作流程服務執行個體,當 Workflow 執行階段因為處理要求的過程,而嘗試保有該服務執行個體時,工作流程執行個體可能會出現因為無止盡遞迴而發生堆疊溢位。 若工作流程執行個體的狀態是正在等待某些其他未完成的 WCF 要求進入至另一個服務才能完成,就會發生此問題。 TransactedCancelTransactedTerminate 作業會為該工作流程服務執行個體,建立已排入佇列的工作項目。 處理 TransactedCancel/TransactedTerminate 要求的過程中,不會執行這些工作項目。 因為工作流程服務執行個體正忙於等候其他未完成的 WCF 要求完成,所以建立的工作項目會維持在佇列中。 TransactedCancel/TransactedTerminate 作業已完成,且控制權已回到用戶端。 當交易與嘗試認可的 TransactedCancel/TransactedTerminate 作業相關聯時,它需要保有該工作流程服務執行個體的狀態。 但因為執行個體仍有未完成的 WCF要求,所以工作流程執行階段無法保有該工作流程服務執行個體,因而發生無止盡的遞迴迴圈而導致堆疊溢位。因為 TransactedCancelTransactedTerminate 只會在記憶體中建立工作項目,所以交易存在的事實並沒有任何影響。 復原交易並不會捨棄該工作項目。為解決此問題,從 .NET Framework 4.7.2 起已引進了 AppSetting,其可新增至工作流程服務的 web.config/app.config,告知它可忽略 TransactedCancelTransactedTerminate 的交易。 如此即可讓交易在無須等待要保有工作流程執行個體的情況下進行認可。 此功能的 AppSetting 名稱為 microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate。 值 true 表示應忽略該交易,以避免堆疊溢位。 此 AppSetting 的預設值為 false,因此不會影響現有的工作流程服務執行個體。

建議

若目前使用 AppFabric 或另一個 IWorkflowInstanceManagement 用戶端,且在嘗試取消或終止工作流程執行個體時,在工作流程服務執行個體中發生了堆疊溢位,您可以將下列內容加入工作流程服務的 web.config/app.config 檔案之 <appSettings> 區段中:

<add key="microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate" value="true"/>

若未遇到問題,則不需要執行這項動作。

名稱
範圍 Edge
版本 4.7.2
類型 正在重定目標