.NET Framework 4.7.x への移行に関する変更の再ターゲット

この記事では、.NET Framework 4.74.7.1、および 4.7.2 で生じたアプリの互換性の問題について説明します。

.NET Framework 4.7

ASP.NET

HttpRuntime.AppDomainAppPath で NullReferenceException がスローされる

説明

ランタイムによってスローされる、.NET Framework 4.6.2、T:System.NullReferenceException取得するときに、 P:System.Web.HttpRuntime.AppDomainAppPath null 文字を含む値です。 .NET Framework 4.6.1 と以前のバージョンでは、ランタイムによってスローされる、T:System.ArgumentNullExceptionです。

提案される解決策

次のいずれかでこの変更に対応できます。

  • アプリケーションが .NET Framework 4.6.2 で実行されている場合には T:System.NullReferenceException を処理します。
  • .NET Framework 4.7 にアップグレードします。以前の動作が復元され、T:System.ArgumentNullException がスローされます。
名前
スコープ エッジ
バージョン 4.6.2
種類 再ターゲット中

影響を受ける API

セッションあたりの同時実行される要求のスロットル

説明

.NET Framework 4.6.2 以前の場合、ASP.NET は同じ Sessionid の要求を順番に実行します。ASP.NET は既定で常にクッキーを経由して Sessionid を発行します。 ページの応答に長い時間がかかる場合、ブラウザーの F5 を押すだけで、サーバーのパフォーマンスが大幅に低下します。 この修正プログラムでは、キューに置かれた要求を追跡し、特定の制限を超えたときに要求を終了するためのカウンターを追加しました。 既定値は 50 です。 制限に達すると、警告がイベント ログに記録され、HTTP 500 応答は IIS ログに記録される可能性があります。

提案される解決策

以前の動作を復元するには、次の設定を web.config ファイルに追加して、新しい動作を無効にできます。

<appSettings>
    <add key="aspnet:RequestQueueLimitPerSession" value="2147483647"/>
</appSettings>
名前
スコープ エッジ
バージョン 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>
名前
スコープ マイナー
バージョン 4.7
種類 再ターゲット中

影響を受ける API

SslStream で TLS アラートに対応

説明

TLS ハンドシェイクに失敗すると、最初の I/O 読み取り/書き込み操作によって System.IO.IOException と内部例外 System.ComponentModel.Win32Exception がスローされます。 TLS および SSL アラートの Schannel エラー コードを使用して、System.ComponentModel.Win32ExceptionSystem.ComponentModel.Win32Exception.NativeErrorCode コードをリモート パーティからの TLS アラートにマップすることができます。詳しくは、RFC 2246: セクション 7.2.2「Error alerts (エラー アラート)」を参照してください。
.NET Framework 4.6.2 およびそれより前のバージョンでの動作では、他のパーティがハンドシェイクに失敗してそのすぐ後に接続を拒否した場合、トランスポート チャネル (通常は TCP 接続) は書き込みまたは読み取り中にタイムアウトします。

提案される解決策

Read(Byte[], Int32, Int32)/Write(Byte[], Int32, Int32) などのネットワーク I/O API を呼び出すアプリケーションは、IOException または System.TimeoutException を処理する必要があります。
TLS アラート機能は、.NET Framework 4.7 以降では既定で有効になります。 .NET Framework 4.7 またはそれより後のシステムで動作する 4.0 から 4.6.2 のバージョンの .NET Framework を対象とするアプリケーションは、互換性を維持するためにこの機能を無効にします。
.NET Framework 4.7 以降で動作する .NET Framework 4.6 以降のアプリケーションでこの機能を有効または無効にするには、次の構成 API を使います。

  • プログラムによる: ServicePointManager は 1 回のみ初期化するため、アプリケーションで行われる一番最初の動作にする必要があります。

    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>
    
  • レジストリ キー (マシン グローバル): .NET Framework 4.6 - 4.6.2 でこの機能を有効にするには、Value を false に設定します。

    Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts
    - Type: String
    - Value: "true"
    
名前
スコープ エッジ
バージョン 4.7
種類 再ターゲット中

影響を受ける API

セキュリティ

CspParameters.ParentWindowHandle が HWND 値を受け取るようになる

説明

.NET Framework 2.0 で導入された ParentWindowHandle 値をアプリケーションに使用すると、親ウィンドウのハンドル値を登録できます。これを利用して、キーにアクセスする必要がある UI (PIN プロンプトや同意を求めるダイアログなど) を、指定したウィンドウの子のモーダルとして開くことができます。 .NET Framework 4.7 を対象とするアプリ以降では、Windows フォーム アプリケーションは、次のようなコードを使用して、ParentWindowHandle プロパティを設定できます。

cspParameters.ParentWindowHandle = form.Handle;

以前のバージョンの .NET Framework では、HWND 値が置かれているメモリ内の場所を表す System.IntPtr が値として必要でした。 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.DoNotAddrOfCspParentWindowHandletrue に設定して、動作変更を無効にできます。

  • プログラムで AppContext の互換性スイッチを設定する (説明はこちらにあります)。
  • app.config ファイルの <runtime> セクションに以下の行を追加する:
<runtime>
 <AppContextSwitchOverrides value="Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle=true"/>
</runtime>

逆に、アプリケーションが以前のバージョンの .NET Framework の下で読み込むとき、.NET Framework 4.7 ランタイムで新しい動作を選択する場合、AppContext スイッチを false に設定できます。

名前
スコープ マイナー
バージョン 4.7
種類 再ターゲット中

影響を受ける API

SslStream で TLS アラートに対応

説明

TLS ハンドシェイクに失敗すると、最初の I/O 読み取り/書き込み操作によって System.IO.IOException と内部例外 System.ComponentModel.Win32Exception がスローされます。 TLS および SSL アラートの Schannel エラー コードを使用して、System.ComponentModel.Win32ExceptionSystem.ComponentModel.Win32Exception.NativeErrorCode コードをリモート パーティからの TLS アラートにマップすることができます。詳しくは、RFC 2246: セクション 7.2.2「Error alerts (エラー アラート)」を参照してください。
.NET Framework 4.6.2 およびそれより前のバージョンでの動作では、他のパーティがハンドシェイクに失敗してそのすぐ後に接続を拒否した場合、トランスポート チャネル (通常は TCP 接続) は書き込みまたは読み取り中にタイムアウトします。

提案される解決策

Read(Byte[], Int32, Int32)/Write(Byte[], Int32, Int32) などのネットワーク I/O API を呼び出すアプリケーションは、IOException または System.TimeoutException を処理する必要があります。
TLS アラート機能は、.NET Framework 4.7 以降では既定で有効になります。 .NET Framework 4.7 またはそれより後のシステムで動作する 4.0 から 4.6.2 のバージョンの .NET Framework を対象とするアプリケーションは、互換性を維持するためにこの機能を無効にします。
.NET Framework 4.7 以降で動作する .NET Framework 4.6 以降のアプリケーションでこの機能を有効または無効にするには、次の構成 API を使います。

  • プログラムによる: ServicePointManager は 1 回のみ初期化するため、アプリケーションで行われる一番最初の動作にする必要があります。

    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>
    
  • レジストリ キー (マシン グローバル): .NET Framework 4.6 - 4.6.2 でこの機能を有効にするには、Value を false に設定します。

    Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts
    - Type: String
    - Value: "true"
    
名前
スコープ エッジ
バージョン 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>
名前
スコープ エッジ
バージョン 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>
名前
スコープ エッジ
バージョン 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 にアップグレードします。

名前
スコープ エッジ
バージョン 4.6.1
種類 再ターゲット中

ImageSourceConverter.ConvertFrom からの例外処理コード内の NullReferenceException

説明

ConvertFrom(ITypeDescriptorContext, CultureInfo, Object) の例外処理コードのエラーでは、目的の例外 (System.IO.DirectoryNotFoundException または System.IO.FileNotFoundException) の代わりに System.NullReferenceException が誤ってスローされていました。 この変更によりエラーが修正されるため、このメソッドは正しい例外をスローするようになりました。

既定では、.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>
名前
スコープ エッジ
バージョン 4.7
種類 再ターゲット中

影響を受ける API

WPF Grid での -column への領域の割り当て

詳細

.NET Framework 4.7 以降では、WPF で Grid が *-column に領域を割り当てるために使うアルゴリズムが置き換えられます。 これにより、*-column に割り当てられる実際の幅が、次のようにさまざまな場合で変わります。

  • 1 つまたは複数の *-column に、その列の比例割り当てをオーバーライドする最小値または最大値の幅もある場合。 (最小値の幅は、明示的な MinWidth 宣言、または列の内容から取得した暗黙的な最小値に由来する可能性があります。最大値の幅は、明示的な MaxWidth 宣言にのみ由来します。)
  • 1 つまたは複数の *-column で 10^298 を超える非常に大きな *-weight を宣言した場合。
  • *-weight が大幅に異なるため、浮動小数点が不安定になる場合 (オーバーフロー、アンダーフロー、精度の低下)。
  • レイアウトの丸めが有効で、ディスプレイの実効 DPI が十分に高い場合。 最初の 2 つの場合、新しいアルゴリズムで生成される幅は、古いアルゴリズムで生成される幅と大幅に異なる可能性があります。最後の場合、違いは最大で 1 から 2 ピクセルです。

古いアルゴリズムには次のバグがありましたが、新しいアルゴリズムで修正されました。

  • 列への割り当ての合計は、グリッドの幅を超える可能性があります。 この問題は、比例配分が最小サイズ未満の列に領域を割り当てると発生します。 このアルゴリズムでは最小サイズが割り当てられるため、他の列に使用できる領域が減ります。 割り当てる *-column がなくなると、割り当ての合計は大きくなりすぎます。

  • 割り当ての合計が、グリッドの幅未満になる可能性があります。 これは、問題 1 と重なる問題で、比例配分共有が最大サイズを超えている列に割り当て、不足を補う *-column が残っていない場合に発生します。

  • 2 つの *-column が、その *-weight に比例していない割り当てを受ける可能性があります。 これは問題 1、2 よりも軽度な問題です。*-column A、B、C に (この順序で) 割り当てると、B の比例配分共有はその最小値 (または最大値) に違反します。 前述のように、これによって列 C に使用できる領域が変わり、A よりも比例配分の割り当てが少なく (または多く) なります。

  • 非常に大きな重みの列 (10^298 を超える場合) は、すべて 10^298 の重みとして処理されます。 そのような列 (およびやや小さな重みの列) の比例配分の差は考慮されません。

  • 無限の重みを持つ列が正しく処理されません。 (実際には重みを無限大に設定することはできませんが、これは人為的な制限です。割り当てコードは制限を処理しようとしますが、適切に処理できません。)

  • オーバーフロー、アンダーフロー、精度の低下などの浮動小数点精度の問題を回避していますが、いくつかの軽微な問題があります。

  • 十分に高い DPI でレイアウトの丸めの調整が不適切です。 新しいアルゴリズムでは、次の条件を満たす結果が生成されます。

    • *-column に割り当てられる実際の幅が、幅の最小値未満にならない、また幅の最大値を超えないようにします。
    • 最小値または最大値の幅が割り当てられていない各 *-column に、その *-weight に比例した幅を割り当てます。 正確には、2 つの列の幅がそれぞれ x*、y* と宣言され、いずれの列も最小値の幅または最大値の幅が割り当てられていない場合、各列に割り当てられる実際の幅 v と w は同じ比率の v / w == x / y になります。
    • "比例配分" の *-column に割り当てられる幅の合計は、制限された列 (固定、自動、および最小または最大の幅が割り当てられた *-column) に割り当てられた後に使用できる領域と同じなります。 たとえば、最小値の幅の合計がグリッドに使用できる幅を超える場合は、ゼロになる可能性があります。
    • これらすべてのステートメントは "理想的な" レイアウトを基準に解釈されます。 レイアウトの丸めが有効な場合、実際の幅は理想的な幅と最大 1 ピクセル異なる可能性があります。

Note

この記事で取り上げた列と幅のすべての情報は、行と高さにも適用されます。

サジェスチョン

@.NET Framework 4.7 以降のバージョンの .NET Framework を対象とするアプリの場合、既定で新しいアルゴリズムが参照されますが、.NET Framework 4.6.2 以前のバージョンを対象とするアプリでは以前のアルゴリズムが参照されます。

この既定をオーバーライドするには、次の構成設定を使用します。

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

true を設定すると以前のアルゴリズムが選択され、false を設定すると新しいアルゴリズムが選択されます。

名前
スコープ マイナー
バージョン 4.7
種類 再ターゲット中

WPF ポインター ベースのタッチ スタック

説明

この変更で、オプションの WM_POINTER ベースの WPF タッチ/スタイラス スタックを有効にする機能が追加されます。 これを明示的に有効にしていない開発者は、WPF タッチ/スタイラス動作の変更を確認できません。オプションの WM_POINTER ベースのタッチ/スタイラス スタックに関する現在の既知の問題を以下に示します。

  • リアルタイム インクがサポートされない。
  • インクと StylusPlugins がまだ機能している間は、UI スレッドで処理されますが、パフォーマンスの低下につながる可能性があります。
  • プロモーションの変更により、タッチ/スタイラス イベントからマウス イベントに動作が変更される。
  • 操作の動作が異なる場合があります。
  • ドラッグ/ドロップでは、タッチ入力の適切なフィードバックが表示されません。
  • これはスタイラス入力には影響しません。
  • ドラッグ/ドロップは、タッチ/スタイラス イベントで開始できなくなりました。
  • そのため、マウス入力が検出されるまで、アプリケーションが応答を停止する可能性があります。
  • 代わりに、開発者はマウス イベントからドラッグ アンド ドロップを開始する必要があります。

提案される解決策

このスタックを有効にする開発者は、アプリケーションの App.config ファイルに次の行を追加/マージできます。

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

これを削除するか、値を false に設定すると、このオプションのスタックがオフになります。このスタックは Windows 10 Creators Update 以降でのみ使用できることに注意してください。

名前
スコープ エッジ
バージョン 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>
名前
スコープ マイナー
バージョン 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 のアクセシビリティ テクノロジの処理方法が向上しています。 この機能強化には次の変更内容が含まれています。

  • [詳細の表示] ウィザードの [フィールドの追加] ダイアログや ListView ウィザードの [ListView の構成] ダイアログなど、コントロールで不足していた UI アクセシビリティ パターンを実装するための変更。
  • データ ページャー フィールド エディターなど、ハイ コントラスト モードでの表示を改善するための変更。
  • DataPager コントロールの [ページャーのフィールドを編集] ウィザードの [フィールド] ダイアログ、[ObjectContext の構成] ダイアログ、[データ ソースの構成] ウィザードの [データの選択の構成] ダイアログなど、キーボードの操作性を改善するための変更。

提案される解決策

以上の変更を選択する方法と選択しない方法 Visual Studio デザイナーの場合、.NET Framework 4.7.1 以降で実行しなければ、以上の変更から改善を得ることはありません。 Web アプリケーションの場合、次のいずれかの手法をとることで、以上の変更によって機能が強化されます。

  • Visual Studio 2017 15.3 以降をインストールする。このバージョンからは既定で、次の項目にある AppContext スイッチで新しいアクセシビリティ機能に対応しています。
  • 下の例のように、devenv.exe.config ファイルの <runtime> セクションに Switch.UseLegacyAccessibilityFeatures AppContext スイッチを追加し、それを 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 に設定することで以前のアクセシビリティ機能を選択できます。

名前
スコープ マイナー
バージョン 4.7.1
種類 再ターゲット中

コア

SerialPort バックグラウンド スレッドの例外

説明

OS 例外がスローされたとき、SerialPort ストリームで作成されたバックグラウンド スレッドによってプロセスが終了することがなくなりました。
.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>
名前
スコープ マイナー
バージョン 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 より前のバージョンを対象とするアプリケーションでこの動作を望む場合、アプリケーション構成ファイルの runtime セクションに次の AppContextSwitchOverrides 要素を追加してください。

<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=false" />
名前
スコープ マイナー
バージョン 4.7.1
種類 再ターゲット中

影響を受ける API

セキュリティ

既定の SignedXML アルゴリズムと SignedXMS アルゴリズムが SHA256 に変更

説明

.NET Framework 4.7 以前では、一部の操作において SignedXML と SignedCMS の初期設定が SHA1 でした。 .NET Framework 4.7.1 より、同じ操作で SHA256 が既定で有効になります。 この変更が必要になったのは、SHA1 は安全であると見なされなくなったためです。

提案される解決策

SHA1 (安全でない) または SHA256 を既定で使用するかどうかを制御する新しいコンテキスト スイッチ値が 2 つあります。

  • Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms
  • Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms。.NET Framework 4.7.1 以降のバージョンを対象とするアプリケーションで SHA256 の使用が望ましくない場合は、アプリ構成ファイルの runtime セクションに次の構成スイッチを追加することで既定を SHA1 に戻すことができます。
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=true;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=true" />

.NET Framework 4.7 以前のバージョンを対象とするアプリケーションの場合、アプリの構成ファイルの runtime セクションに次の構成スイッチを追加することでこの変更を選択できます。

<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=false;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=false" />
名前
スコープ マイナー
バージョン 4.7.1
種類 再ターゲット中

影響を受ける API

変更の対象を変更せず、SignedXml.GetPublicKey が net462 (または Light-Up) で RSACng を返す

説明

.NET Framework 4.6.2 より、SignedXml.GetPublicKey メソッドによって返されるオブジェクトの具象型が CryptoServiceProvider 実装から Cng 実装に変わりました。これは突然の変更ではなく、 certificate.PublicKey.Key の使用から、certificate.GetAnyPublicKey に転送する内部 RSACertificateExtensions.GetRSAPublicKey の使用に実装が変わったためです。

提案される解決策

.NET Framework 4.7.1 で実行されるアプリから、アプリの構成ファイルの runtime セクションに次の構成スイッチを追加することで、.NET Framework 4.6.1 以前のバージョンで既定で使用されていた CryptoServiceProvider 実装を使用できます。

<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.SignedXmlUseLegacyCertificatePrivateKey=true" />
名前
スコープ エッジ
バージョン 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>
名前
スコープ エッジ
Version 4.7.1
種類 再ターゲット中

Windows フォーム

Windows フォーム コントロールでのアクセシビリティの向上

説明

Windows フォームはアクセシビリティ テクノロジによってユーザー サポートの動作が向上します。 これには、.NET Framework 4.7.1 以降の次の変更が含まれます。

  • ハイ コントラスト モード中の表示が向上する変更。
  • プロパティ ブラウザーのエクスペリエンスが向上する変更。 プロパティ ブラウザーについては次のような点が向上します。
  • さまざまなドロップダウン選択ウィンドウを利用することでキーボード操作が便利になりました。
  • 不要なタブ ストップが減ります。
  • コントロールの種類の報告機能が改善されました。
  • ナレーターの動作が改善されました。
  • コントロールに不足している UI アクセシビリティ パターンを実装する変更。

提案される解決策

これらの変更を選択する方法と選択しない方法 アプリケーションでこれらの変更を利用するには、.NET Framework 4.7.1 以降で実行する必要があります。 アプリケーションは、次のいずれかの方法でこれらの変更を利用できます。

  • .NET Framework 4.7.1 を対象にして再コンパイルします。 .NET Framework 4.7.1 以降を対象とする Windows フォーム アプリケーションでは、これらのアクセシビリティの変更が既定で有効になります。
  • 下の例のように、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 インターフェイスを要求できます。 詳しくは、「Using IAccessibleEx from a Client」(クライアントからの IAccessibleEx の使用) をご覧ください。 .NET Framework 4.7.1 以降では、IServiceProvider と IAccessibleEx (該当する場合) を WinForms ユーザー補助オブジェクトで使用できます。

.NET Framework 4.7.1 では、次の UI オートメーション パターンやプロパティのサポートが追加されます。

  • ToolStripSplitButton および ComboBox コントロールは、展開/折りたたみパターンをサポートします。

  • ToolStripMenuItem コントロールの ControlType プロパティの値は ControlType.MenuItem です。

  • ToolStripItem コントロールは、NameProperty プロパティと展開/折りたたみパターンをサポートします。

  • ToolStripDropDownItem コントロールは、ドロップダウンが展開されたり折りたたまれたりしたときの StateChange と NameChange を示す AccessibleEvents をサポートします。

  • ToolStripDropDownButton コントロールの ControlType プロパティの値は ControlType.MenuItem です。

  • DataGridViewCheckBoxCell コントロールは TogglePattern をサポートします。

  • NumericUpDown および DomainUpDown コントロールは NameProperty プロパティをサポートし、ControlTypeControlType.Spinner です。

    PropertyGrid コントロールの向上 .NET Framework 4.7.1 では、PropertyBrowser コントロールが次のように向上します。

  • ユーザーが PropertyGrid コントロールに誤った値を入力すると表示されるエラー ダイアログの [詳細] ボタンは、展開/折りたたみパターン、状態と名前の変更通知、および ControlType プロパティの値 ControlType.MenuItem をサポートします。

  • エラー ダイアログの [詳細] ボタンを展開すると表示されるメッセージ ウィンドウは、キーボードでアクセスできるようになり、エラー メッセージの内容をナレーターで読み上げることができます。

  • PropertyGrid コントロールの行の AccessibleRole は、"Row" から "Cell" に変更されました。 セルは UIA の ControlType "DataItem" にマップし、適切なキーボード ショートカットとナレーターの読み上げをサポートすることができます。

  • PropertyGrid コントロールの PropertySort プロパティが PropertySort.Categorized に設定されているときにヘッダー項目を表す PropertyGrid コントロールの行は、ControlType プロパティの値が ControlType.Button です。

  • PropertyGrid コントロールの PropertySort プロパティが PropertySort.Categorized に設定されているときにヘッダー項目を表す PropertyGrid コントロールの行は、展開および折りたたみパターンをサポートします。

  • グリッドとその上にある ToolBar の間のキーボード ナビゲーションが向上します。 "Shift + Tab" キーを押すと、ツール バー全体ではなく、ツール バーの最初のボタンが選択されるようになりました。

  • ハイ コントラスト モードで表示された PropertyGrid コントロールでは、PropertySort プロパティの現在の値に対応する ToolBar ボタンの周囲にフォーカス四角形が描画されます。

  • ハイ コントラスト モードで表示され、PropertySort プロパティが PropertySort.Categorized に設定された PropertyGrid コントロールでは、カテゴリ ヘッダーの背景がハイ コントラストの色で表示されます。

  • PropertyGrid コントロールでは、フォーカスが設定された ToolBar 項目と、PropertySort プロパティの現在の値を示す ToolBar 項目の区別が明確になります。 この修正は、ハイ コントラストの変更と、非ハイ コントラストのシナリオに対する変更で構成されます。

  • PropertySort プロパティの現在の値を示す PropertyGrid コントロールの ToolBar 項目は、TogglePattern をサポートします。

  • 配置ピッカーで選択された配置を区別するナレーターのサポートが向上します。

  • 空の PropertyGrid コントロールがフォームに表示されているとき、以前はフォーカスを設定されませんでしたが、現在はフォーカスを設定されるようになっています。

ハイ コントラスト テーマでの OS で定義された色の使用

  • FlatStyle プロパティが FlatStyle.System (既定のスタイル) に設定された Button および CheckBox コントロールは、ハイ コントラスト テーマが選択されているときは OS で定義された色を使用するようになりました。 以前は、テキストと背景の色はコントラストが同じで、見分けるのが困難でした。
  • Enabled プロパティが false に設定された ButtonCheckBoxRadioButtonLabelLinkLabelGroupBox コントロールでは、以前は影付きの色を使ってハイ コントラスト テーマのテキストがレンダリングされており、背景に対するコントラストが低くなっていました。 現在は、これらのコントロールは OS によって定義された "Disabled Text(無効なテキスト)" の色を使うようになっています。 この修正は、FlatStyle プロパティが FlatStyle.System 以外の値に設定されたコントロールに適用されます。 後者のコントロールは OS によってレンダリングされます。
  • DataGridView では、現在フォーカスが設定されているセルの内容を囲むように目に見える四角形がレンダリングされます。 以前は、特定のハイ コントラスト テーマではこれは見えませんでした。
  • Enabled プロパティが false に設定された ToolStripMenuItem コントロールは、OS によって定義された "無効な文字" の色を使うようになりました。
  • Checked プロパティが true に設定された ToolStripMenuItem コントロールは、コントラストのあるシステム カラーで関連するチェック マークをレンダリングするようになりました。 以前は、チェック マークの色に十分なコントラストがなく、ハイ コントラスト テーマでは見えませんでした。 注:Windows 10 では、一部のハイ コントラストのシステム カラーの値が変更されています。 Windows フォームのフレームワークは、Win32 フレームワークに基づいています。 最も快適に利用するためには、最新版の Windows で実行し、テスト アプリケーションに app.manifest ファイルを追加して最新の OS 変更を選択し、次のコードのコメントを解除します。
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

キーボード ナビゲーションの向上

  • ComboBox コントロールの DropDownStyle プロパティが ComboBoxStyle.DropDownList に設定されていて、フォームのタブ オーダーで最初のコントロールである場合、キーボードを使って親フォームが開かれると、コントロールにフォーカスの四角形が表示されるようになりました。 この変更の前は、キーボード フォーカスはこのコントロールに設定されましたが、フォーカス インジケーターはレンダリングされませんでした。

ナレーター サポートが改善されました

  • MonthCalendar コントロールに、以前は行われなかったナレーターによるコントロールの値の読み上げなど、コントロールにアクセスするための支援技術のサポートが追加されました。

  • CheckedListBox コントロールは、CheckBox.CheckState プロパティが変更されるとナレーターに通知するようになりました。 以前は、ナレーターは通知を受け取らなかったため、ユーザーには CheckState プロパティが更新されたことが知らされませんでした。

  • LinkLabel コントロールがコントロール内のテキストをナレーターに通知する方法が変更されました。 以前は、ナレーターはこのテキストを 2 回読み上げ、ユーザーには表示されなくても "&" 記号を実際のテキストとして読んでいました。 重複するテキストおよび不要な "&" 記号が、ナレーターの読み上げから除去されました。

  • DataGridViewCell コントロールの種類が、読み取り専用の状態をナレーターおよびその他の支援技術に正しくレポートするようになりました。

  • ナレーターは、[マルチドキュメント インターフェイス]~/docs/framework/winforms/advanced/multiple-document-interface-mdi-applications.md) アプリケーションの子ウィンドウのシステム メニューを読み上げられるようになりました。

  • ナレーターは、ToolStripItem.Enabled プロパティが false に設定された ToolStripMenuItem コントロールを読み上げられるようになりました。 以前のナレーターは、無効なメニュー項目にフォーカスを設定できず、内容を読み上げることができませんでした。

名前
スコープ Major
バージョン 4.8
種類 再ターゲット中

影響を受ける API

Windows Presentation Foundation (WPF)

WPF でのアクセシビリティの向上

説明

ハイ コントラストの改善

  • Expander コントロールにフォーカスを合わせると、表示されるようになりました。 .NET Framework の以前のバージョンでは、そうではありませんでした。
  • CheckBox および RadioButton コントロールを選択したとき、コントロールのテキストが .NET Framework の以前のバージョンより見やすくなりました。
  • 無効になっている ComboBox の境界が、無効なテキストと同じ色になりました。 .NET Framework の以前のバージョンでは、そうではありませんでした。
  • 無効になっているボタンにフォーカスを合わせたとき、正しいテーマ色が使われるようになりました。 .NET Framework の以前のバージョンでは、そうではありませんでした。
  • ドロップダウン ボタンが、ComboBox コントロールのスタイルが ToolBar.ComboBoxStyleKey に設定されている場合、表示されるようになりました。 .NET Framework の以前のバージョンでは、そうではありませんでした。
  • DataGrid コントロールの並べ替えインジケーターの矢印で、テーマの色が使われるようになりました。 .NET Framework の以前のバージョンでは、そうではありませんでした。
  • ハイパーリンクの既定のスタイルが、マウスでポイントされると正しいテーマの色に変わるようになりました。 .NET Framework の以前のバージョンでは、そうではありませんでした。
  • ラジオ ボタンに対するキーボード フォーカスが表示されるようになりました。 .NET Framework の以前のバージョンでは、そうではありませんでした。
  • DataGrid コントロールのチェック ボックス列で、キーボード フォーカスのフィードバックに予期される色が使われるようになりました。 .NET Framework の以前のバージョンでは、そうではありませんでした。
  • ComboBox および ListBox コントロールで、キーボード フォーカスのビジュアルが表示されるようになりました。 .NET Framework の以前のバージョンでは、そうではありませんでした。

スクリーン リーダーの操作性の向上

  • Expander コントロールが、スクリーン リーダーによってグループ (展開/折りたたみ) として正しく読み上げられるようになりました。
  • DataGridCell コントロールが、スクリーン リーダーによってデータ グリッド セル (ローカライズ済み) として正しく読み上げられるようになりました。
  • スクリーン リーダーが、編集可能な ComboBox の名前を読み上げるようになりました。
  • スクリーン リーダーが、PasswordBox コントロールを "ビューに項目がありません" と読み上げなくなりました。

LiveRegion のサポート

ナレーターなどのスクリーン リーダーでは、通常は現在フォーカスがあるユーザー インターフェイス要素を説明して、ユーザーがアプリケーションの UI を理解するのを助けます。 しかし、画面内のどこかの UI 要素が変わり、フォーカスがなくなった場合、ユーザーに通知されず、重要な情報を逃すことがあります。 LiveRegions は、この問題を解決するためのものです。 開発者はこれを利用して、UI 要素が大幅に変更されたことをスクリーン リーダーやその他の UI オートメーション クライアントに伝えることができます。 指示後、スクリーン リーダーでは、その変更をユーザーに通知する方法とタイミングが決定されます。 LiveSetting プロパティを使うと、UI に行われた変更をユーザーに通知するのがどの程度重要かをスクリーン リーダーに知らせることもできます。

提案される解決策

これらの変更を選択する方法と選択しない方法

アプリケーションでこれらの変更を利用するには、.NET Framework 4.7.1 以降で実行する必要があります。 アプリケーションは、次のいずれかの方法でこれらの変更を利用できます。

  • .NET Framework 4.7.1 を対象にします。 この方法をお勧めします。 .NET Framework 4.7.1 以降を対象とする WPF アプリケーションでは、これらのアクセシビリティの変更が既定で有効になっています。

  • 下の例のように、アプリ構成ファイルの <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 オートメーションの概要」を参照してください。

名前
スコープ Major
バージョン 4.7.1
種類 再ターゲット中

影響を受ける API

セレクター SelectionChanged イベントおよび SelectedValue プロパティ

説明

NET Framework 4.7.1 以降、Selector は選択の変更が発生すると必ず、SelectionChanged イベントが発生する前に SelectedValue プロパティの値を更新します。 これにより、SelectedValue プロパティと、イベント発生前に更新されるその他の選択プロパティ (SelectedItem および SelectedIndex) との整合性が確保されます。

.NET Framework 4.7 以前のバージョンでは、ほとんどの場合、イベントの前に SelectedValue に対する更新が行われました。しかし、選択の変更が 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>
名前
スコープ マイナー
バージョン 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>
名前
スコープ マイナー
バージョン 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 より前のフレームワーク バージョンを対象とするときにこの変更を利用する開発者または .NET Framework 4.7.1 以上を対象とするときに以前の機能を必要とする開発者は、次の AppContext フラグを適宜設定することができます。 true の値を設定すると、SHA1 が既定のアルゴリズムとして使用され、false の値を設定すると SHA256 が使用されます。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.UseSha1AsDefaultHashAlgorithmForDigitalSignatures=true"/>
</runtime>
</configuration>
名前
スコープ エッジ
Version 4.7.1
種類 再ターゲット中

影響を受ける API

Windows Workflow Foundation (WF)

Windows Workflow Foundation (WF) ワークフロー デザイナーでのアクセシビリティの向上

説明

Windows Workflow Foundation (WF) ワークフロー デザイナーは、アクセシビリティ テクノロジによって操作性が向上しています。 次のような改善点があります。

  • 一部のコントロールで、タブ オーダーが左から右、上から下に変更されます:
  • InitializeCorrelation アクティビティの関連付けデータを設定するための関連付けの初期化ウィンドウ
  • ReceiveSendSendReply、および ReceiveReply アクティビティのコンテンツ定義ウィンドウ
  • キーボードで利用できる機能が増えます:
  • アクティビティのプロパティを編集する際、プロパティ グループに初めてフォーカスを設定したときに、プロパティ グループをキーボードで折りたたむことができます。
  • 警告アイコンにキーボードでアクセスできるようになりました。
  • [プロパティ] ウィンドウの [その他のプロパティ] ボタンに、キーボードでアクセスできるようになりました。
  • キーボードを使って、ワークフロー デザイナーの [引数] および [変数] ウィンドウのヘッダー項目にアクセスできるようになりました。
  • 次のような場合に、フォーカスのある項目の可視性が向上しました:
  • ワークフロー デザイナーおよびアクティビティ デザイナーで使われているデータ グリッドへの行の追加。
  • ReceiveReply および SendReply アクティビティ内のフィールド間の Tab 移動。
  • 変数または引数の既定値の設定
  • スクリーン リーダーが正しく認識できるようになりました:
  • ワークフロー デザイナーで設定されたブレークポイント。
  • FlowSwitch<T>FlowDecisionCorrelationScope アクティビティ。
  • Receive アクティビティの内容。
  • InvokeMethod アクティビティのターゲットの種類。
  • TryCatch アクティビティの [例外] コンボ ボックスと [Finally] セクション。
  • メッセージング アクティビティの [メッセージの種類] コンボ ボックス、[関連付け初期化子の追加] ウィンドウのスプリッター、[コンテンツ定義] ウィンドウで、および [CorrelatesOn の定義] ウィンドウ (ReceiveSendSendReply、および ReceiveReply)。
  • ステート マシンの遷移と遷移先。
  • FlowDecision アクティビティの注釈とコネクタ。
  • アクティビティのコンテキスト (右クリック) メニュー。
  • プロパティ グリッドの、プロパティ値エディター、[検索のクリア] ボタン、[カテゴリ別] および [アルファベット順] の並べ替えボタン、[式エディター] ダイアログ。
  • ワークフロー デザイナーのズーム パーセンテージ。
  • Parallel および Pick アクティビティの区切り記号。
  • 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 上で実行している場合は、次の AppContext スイッチを app.config ファイルの <runtime> セクションに追加して 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 に設定することで以前のアクセシビリティ機能を選択できます。

名前
スコープ マイナー
バージョン 4.7.1
種類 再ターゲット中

.NET Framework 4.7.2

コア

URI での Unicode の双方向制御文字の許可

説明

Unicode では、テキストの方向を指定するために使用される特殊な制御文字をいくつか指定します。 以前のバージョンの .NET Framework では、これらの文字は、パーセントでエンコードされたフォームに存在する場合でも、すべての URI から正しく削除されませんでした。 RFC 3987 により適切に従うために、これらの文字を URI で使用できるようにしました。 これらの文字は、URI でエンコードされていないことがわかった場合、パーセントでエンコードされます。 パーセントでエンコードされていることがわかった場合は、そのままです。

提案される解決策

4\.7.2 以降のバージョンの .NET Framework を対象とするアプリケーションの場合は、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>
名前
スコープ マイナー
バージョン 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>
名前
スコープ マイナー
バージョン 4.7.2
種類 再ターゲット中

影響を受ける API

System.Uri で一貫した予約文字セットが確実に使用されるようになった

説明

System.Uri では、場合によってはデコードされていたパーセントでエンコードされた特定の文字の状態が常に保たれるようになりました。 これは、URI のパス、クエリ、フラグメント、ユーザー情報コンポーネントにアクセスするプロパティやメソッド全体に適用されます。 以下の両方に該当する場合にのみ、動作が変わります。

  • :'()!* のいずれかの予約文字のエンコードされたフォームが URI に含まれている。
  • Unicode またはエンコードの予約されていない文字が URI に含まれている。 上記の両方に該当する場合、エンコードの予約文字はエンコードされたままです。 以前のバージョンの .NET Framework では、デコードされます。

提案される解決策

4\.7.2 以降のバージョンの .NET Framework を対象とするアプリケーションの場合は、新しいデコード動作が既定で有効になります。 この変更が望ましくない場合、アプリケーションの構成ファイルの <runtime> セクションに次の AppContextSwitchOverrides スイッチを追加することで無効にできます。

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

以前のバージョンの .NET Framework を対象とするが、.NET Framework 4.7.2 以降のバージョンで実行するアプリケーションの場合、新しいデコード動作が既定で無効になります。 これを有効にするには、次の AppContextSwitchOverrides スイッチをアプリケーション構成ファイルの <runtime> セクションに追加します。

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=false" />
</runtime>
名前
スコープ マイナー
バージョン 4.7.2
種類 再ターゲット中

影響を受ける API

resgen で Web からのコンテンツの読み込みが拒否される

説明

.resx ファイルには、バイナリ形式の入力が含まれている場合があります。 resgen を使用して、信頼されていない場所からダウンロードされたファイルを読み込もうとすると、既定で入力の読み込みに失敗します。

提案される解決策

信頼されていない場所からのバイナリ形式の入力を読み込む必要がある resgen ユーザーは、入力ファイルから Web のマークを削除するか、オプトアウト特性を適用できます。次のレジストリ設定を追加して、マシン全体のオプトアウト特性を適用します: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\SDK] "AllowProcessOfUntrustedResourceFiles"="true"

名前
スコープ エッジ
バージョン 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>
名前
スコープ エッジ
バージョン 4.7.2
種類 再ターゲット中

影響を受ける API

Windows フォーム

.NET 4.7.2 の Windows フォーム コントロールでのアクセシビリティの向上

説明

Windows フォーム フレームワークは、アクセシビリティ テクノロジでの動作の向上により、Windows フォームのお客様のサポートが向上しています。 次のような点が変更されます。

  • ハイ コントラスト モード中の表示が向上する変更。
  • DataGridView コントロールと MenuStrip コントロールでのキーボード ナビゲーションが向上する変更。
  • ナレーターとのやり取りの変更。

提案される解決策

これらの変更を選択する方法と選択しない方法 アプリケーションでこれらの変更を利用するには、.NET Framework 4.7.2 以降で実行する必要があります。 アプリケーションは、次のいずれかの方法でこれらの変更を利用できます。

  • .NET Framework 4.7.2 を対象にして再コンパイルします。 .NET Framework 4.7.2 以降を対象とする Windows フォーム アプリケーションでは、これらのアクセシビリティの変更が既定で有効になります。
  • .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;Switch.UseLegacyAccessibilityFeatures.2=false" />
  </runtime>
</configuration>

.NET Framework 4.7.2 で追加されたアクセシビリティ機能にオプトインするには、.NET Framework 4.7.1 のアクセシビリティ機能にもオプトインする必要があることに注意してください。 .NET Framework 4.7.2 以降を対象とするアプリケーションで以前のアクセシビリティ動作を残す場合、この AppContext スイッチを明示的に true に設定することで以前のアクセシビリティ機能を選択できます。

ハイ コントラスト テーマでの OS で定義された色の使用

  • ToolStripDropDownButton のドロップダウン矢印が、OS で定義されているハイ コントラスト テーマの色を使うようになりました。
  • FlatStyleFlatStyle.Flat または FlatStyle.Popup に設定された ButtonRadioButtonCheckBox コントロールは、ハイ コントラスト テーマが選択されているときは OS で定義された色を使用するようになります。 以前は、テキストと背景の色はコントラストが同じで、見分けるのが困難でした。
  • Enabled プロパティが false に設定された GroupBox に含まれるコントロールは、OS で定義されているハイ コントラスト テーマの色を使うようになります。
  • ToolStripButtonToolStripComboBoxToolStripDropDownButton コントロールは、ハイ コントラスト モードでの明度コントラストの比率が高くなりました。
  • DataGridViewLinkCellDataGridViewLinkCell.LinkColor プロパティに対し OS で定義されているハイ コントラスト テーマの色を既定で使うようになります。 注:Windows 10 では、一部のハイ コントラストのシステム カラーの値が変更されています。 Windows フォームのフレームワークは、Win32 フレームワークに基づいています。 最も快適に利用するためには、最新版の Windows で実行し、テスト アプリケーションに app.manifest ファイルを追加して最新の OS 変更を選択し、次のコードのコメントを解除します。
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

ナレーター サポートが改善されました

  • ナレーターは、ToolStripMenuItem のテキストを読み上げるときに、ToolStripMenuItem.ShortcutKeys プロパティの値を読み上げるようになります。
  • ToolStripMenuItemEnabled プロパティが false に設定されている場合、ナレーターはそれを示すようになります。
  • ナレーターは、ListView.CheckBoxes プロパティが true に設定されているとき、チェック ボックスの状態に関するフィードバックを提供するようになります。
  • ナレーター スキャン モードのフォーカス順序が、ClickOnce ダウンロード ダイアログ ウィンドウでのコントロールの視覚的な順序と一致するようになります。

DataGridView のアクセシビリティ サポートの向上

視覚的な手掛かりの向上

  • Text プロパティが空の RadioButton および CheckBox コントロールは、フォーカスを受け取るとフォーカス インジケーターを表示するようになりました。

強化されたプロパティ グリッドのサポート

  • PropertyGrid コントロールの子要素は、PropertyGrid 要素が有効になっている場合にのみ、IsReadOnlyProperty プロパティに対して true を返すようになりました。

  • PropertyGrid コントロールの子要素は、PropertyGrid 要素をユーザーが変更できる場合にのみ、IsEnabledProperty プロパティに対して false を返すようになりました。 UI オートメーションの概要については、「UI オートメーションの概要」を参照してください。

    キーボード ナビゲーションの向上

  • ToolStripButton は、TabStop プロパティが true に設定された ToolStripPanel 内に含まれているときに、フォーカスできるようになりました。

名前
スコープ Major
バージョン 4.7.2
種類 再ターゲット中

入れ子になった ToolStripMenuItems の場合、ContextMenuStrip.SourceControl プロパティには有効なコントロールが含まれる

説明

.NET Framework 4.7.1 およびそれより前のバージョンの ContextMenuStrip.SourceControl プロパティは、ユーザーが入れ子になった ToolStripMenuItem コントロールからメニューを開いたとき、正しくない null を返します。 .NET Framework 4.7.2 およびそれ以降では、SourceControl プロパティには常に実際のソース コントロールが設定されます。

提案される解決策

これらの変更を選択する方法と選択しない方法 アプリケーションでこれらの変更を利用するには、.NET Framework 4.7.2 以降で実行する必要があります。 アプリケーションは、次のいずれかの方法でこれらの変更を利用できます。

  • .NET Framework 4.7.2 を対象にします。 .NET Framework 4.7.2 以降を対象とする Windows フォーム アプリケーションでは、この変更が既定で有効になります。
  • .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 に設定することで、以前のソース コントロール値を選択できます。

名前
スコープ エッジ
バージョン 4.7.2
種類 再ターゲット中

影響を受ける API

PrivateFontCollection.AddFontFile メソッドが Font リソースを解放する

説明

.NET Framework 4.7.1 およびそれより前のバージョンの System.Drawing.Text.PrivateFontCollection クラスは、AddFontFile(String) メソッドを使用してこのコレクションに追加された Font オブジェクトの 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 フォーム アプリケーションでは、この変更が既定で有効になります。
  • .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 に設定することで、フォント リソースを解放しないようにすることができます。

名前
スコープ エッジ
バージョン 4.7.2
種類 再ターゲット中

影響を受ける API

WinForm の Domain upbutton アクションと downbutton アクションが同期するようになった

説明

.NET Framework 4.7.1 およびそれより前のバージョンでは、コントロールにテキストが存在すると DomainUpDown コントロールの DomainUpDown.UpButton() アクションが無視され、開発者は DomainUpDown.UpButton() アクションを使用する前にコントロールで DomainUpDown.DownButton() アクションを使用する必要があります。 .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 フォーム アプリケーションでは、この変更が既定で有効になります。
  • 下の例のように、app.config ファイルの <runtime> セクションに次の AppContext スイッチを追加し、それを false に設定することで、以前のスクロール動作を無効にします。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling=false"/>
</runtime>
名前
スコープ エッジ
バージョン 4.7.2
種類 再ターゲット中

影響を受ける API

Windows Presentation Foundation (WPF)

キーボード フォーカスが WinForms/WPF ホストの複数層の間で正しく移動するようになった

説明

WinForms コントロールをホストし、さらに WPF コントロールをホストする WPF アプリケーションがあるとします。 WinForms 層の最初または最後のコントロールが WPF System.Windows.Forms.Integration.ElementHost である場合、ユーザーはこの層を Tab キーで移動できないことがあります。 今回の変更でこの問題が修正され、ユーザーは WinForms 層を Tab キーで移動できるようになりました。WinForms 層をエスケープしないフォーカスに依存する自動アプリケーションは、期待どおりに動作しなくなる可能性があります。

提案される解決策

.NET 4.7.2 より前のバージョンのフレームワークを対象とするときに、この変更を利用する開発者は、次の一連の AppContext フラグを false に設定することで変更を有効にできます。

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

WPF アプリケーションでより新しい改善を得るには、アクセシビリティに関する以前の改善をすべてオプトインする必要があります。 つまり、Switch.UseLegacyAccessibilityFeatures および Switch.UseLegacyAccessibilityFeatures.2 スイッチの両方が設定されている必要があります。 .NET 4.7.2 以降を対象とするときに、前の機能を必要とする開発者は、次の AppContext フラグを true に設定することで変更を無効にできます。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true"/>
</runtime>
</configuration>
名前
スコープ エッジ
バージョン 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>

.NET 4.7.2 より前のバージョンのフレームワークを対象とするときに SHA256 ハッシュを利用する開発者は、以下の 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 のシャットダウン前にワーカー スレッドで実行されているディスパッチャーを正しくシャットダウンしないアプリケーションで一般的に見られます。 そのようなアプリケーションは、ディスパッチャーの有効期間を適切に管理するように注意する必要があります。

提案される解決策

.NET Framework 4.7.2 以降のバージョンでは、開発者は、クリーンアップの変更によって発生する可能性のあるタイミングの問題を軽減する (ただし、排除ではない) ために、この修正を無効にすることができます。クリーンアップの変更を無効にするには、次の AppContext フラグを使用します。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotInvokeInWeakEventTableShutdownListener=true"/>
</runtime>
</configuration>
名前
スコープ エッジ
バージョン 4.7.2
種類 再ターゲット中

WPF のマスター/詳細シナリオで ADO データを表示するときに主キーが変更される

説明

Order 型の項目の ADO コレクションと、それを主キー "OrderID" によって Detail 型の項目のコレクションに関連付ける "OrderDetails" という関係があるとします。 WPF アプリでは、特定の順序の詳細にリスト コントロールをバインドできます。

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

ここで、DataContext は Order です。 WPF により、OrderDetails プロパティの値 (OrderID がマスター項目の OrderID と一致するすべての Detail 項目のコレクション D) が取得されます。 マスター項目の主キー OrderID を変更すると、動作の変更が発生します。 ADO は、Details コレクション内の影響を受ける各レコード (つまり、コレクション D にコピーされたレコード) の OrderID を自動的に変更します。 では、D はどうなるのでしょうか?

  • 以前の動作:コレクション D はクリアされます。 マスター項目では、プロパティ の変更通知が発生しませんOrderDetails。 ListBox は、空になったコレクション D を引き続き使用します。
  • 新しい動作: コレクション D は変更されません。 その各項目で、OrderID プロパティの変更通知が発生します。 ListBox はコレクション D を引き続き使用し、新しい OrderID に関する詳細を表示します。 WPF は、別の方法 (followParent 引数を true に設定して ADO メソッド DataRowView.CreateChildView(DataRelation, Boolean) を呼び出す) でコレクション D を作成することにより、新しい動作を実装します。

提案される解決策

アプリは、次の AppContext スイッチを使用して新しい動作を取得します。

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

スイッチの既定値は、.NET 4.7.1 以下を対象とするアプリでは true に設定され (古い動作)、.NET 4.7.2 以上を対象とするアプリでは false に設定されます (新しい動作)。

名前
スコープ マイナー
バージョン 4.7.2
種類 再ターゲット中

WPF で、コントロールに内容がないとき、RadioButton と CheckBox のフォーカス ビジュアルが正しく表示されるようになった

説明

.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 アプリケーションで最新の機能強化を利用するには、以前のすべてのアクセシビリティ機能強化を利用する必要があります。 これを行うには、AppContext スイッチ "Switch.UseLegacyAccessibilityFeatures" と "Switch.UseLegacyAccessibilityFeatures.2" の両方を false に設定する必要があります。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;"/>
</runtime>
</configuration>
名前
スコープ エッジ
バージョン 4.7.2
種類 再ターゲット中

WPF TextBox/PasswordBox のテキスト選択がシステム カラーに従っていない

説明

.NET Framework 4.7.1 以前のバージョンでは、WPF の System.Windows.Controls.TextBox および System.Windows.Controls.PasswordBox は装飾層のテキスト選択のみをレンダリングできました。 そのため、一部のシステム テーマではテキストが遮られ、読みにくくなっていました。 .NET framework 4.7.2 以降では、開発者は、この問題を軽減する非装飾ベースの選択レンダリング スキームを有効にするオプションを選択することができます。

提案される解決策

この変更を利用する開発者は、次の AppContext フラグを適切に設定する必要があります。 この機能を利用するには、インストールされている .NET Framework のバージョンが 4.7.2 以上である必要があります。非装飾ベースの選択を有効にするには、次の AppContext フラグを使用します。

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering=false"/>
</runtime>
</configuration>
名前
スコープ エッジ
バージョン 4.7.2
種類 再ターゲット中

Windows Workflow Foundation (WF)

IWorkflowInstanceManagement.TransactedCancel および IWorkflowInstanceManagement.TransactedTerminate の無限再帰の回避

説明

IWorkflowInstanceManagement.TransactedCancel または IWorkflowInstanceManagement.TransactedTerminate API を使用してワークフロー サービス インスタンスを取り消すか終了するとき、状況によっては、Workflow ランタイムが要求の処理の一部としてサービス インスタンスの永続化を試みるときの無限再帰のために、ワークフロー インスタンスでスタック オーバーフローが発生する可能性があります。 問題は、別のサービスに対する他の未処理 WCF 要求が完了するのをワークフロー インスタンスが待機している状態の場合に発生します。 TransactedCancel および TransactedTerminate 操作により、ワークフロー サービス インスタンスのキューに登録される作業項目が作成されます。 これらの作業項目は、TransactedCancel/TransactedTerminate 要求の処理の一部としては実行されません。 ワークフロー サービス インスタンスは他の未処理 WCF 要求が完了するのを待ってビジー状態であるため、作成された作業項目はキューに残ります。 TransactedCancel/TransactedTerminate 操作が完了して、クライアントに制御が返されます。 TransactedCancel/TransactedTerminate 操作に関連付けられているトランザクションは、コミットしようとした場合、ワークフロー サービス インスタンスの状態を永続化する必要があります。 しかし、インスタンスには未処理の WCF 要求があるため、ワークフロー ランタイムはワークフロー サービス インスタンスを永続化できず、無限再帰ループによってスタックがオーバーフローします。TransactedCancelTransactedTerminate はメモリ内にのみ作業項目を作成するので、トランザクションが存在してもまったく影響ありません。 トランザクションのロールバックは作業項目を破棄しません。この問題に対処するため、.NET Framework 4.7.2 以降では、ワークフロー サービスの web.config/app.config に追加できる AppSetting が導入されています。これは、TransactedCancel および TransactedTerminate のトランザクションを無視するようにサービスに指示します。 これにより、ワークフロー インスタンスの永続化を待たずにトランザクションをコミットできます。 この機能の AppSetting には、microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate という名前が付けられています。 値 true はトランザクションを無視することを示し、したがってスタック オーバーフローが回避されます。 この AppSetting の既定値は false なので、既存のワークフロー サービス インスタンスに影響はありません。

提案される解決策

AppFabric または別の IWorkflowInstanceManagement クライアントを使っていて、ワークフロー インスタンスを取り消すか終了しようとするとワークフロー サービス インスタンスでスタック オーバーフローが発生する場合は、ワークフロー サービスの web.config/app.config ファイルの <appSettings> セクションに以下を追加できます。

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

この問題が発生しない場合は、これを行う必要はありません。

名前
スコープ エッジ
バージョン 4.7.2
種類 再ターゲット中