.NET Framework 4.8.x への移行に関するランタイム変更

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

.NET Framework 4.8

ASP.NET

ASP.NET WebForms CheckBox コントロールの InputAttributes および LabelAttributes の処理の修正

説明

.NET Framework 4.7.2 以前のバージョンをターゲットとするアプリケーションでは、WebForms CheckBox コントロールにプログラムで追加された CheckBox.InputAttributes および CheckBox.LabelAttributes がポストバック後に失われます。 .NET Framework 4.8 以降のバージョンをターゲットとするアプリケーションでは、これらはポストバック後に保持されます。

提案される解決策

ポストバック時に属性を復元する動作を正しいものにするには、targetFrameworkVersion を 4.8 以降に設定します。 次に例を示します。

<configuration>
<system.web>
<httpRuntime targetFramework="4.8"/>
</system.web>
</configuration>

これより小さい値に設定した場合、または、まったく設定しない場合、適切でない古い動作が維持されます。

名前
スコープ 不明
バージョン 4.8
種類 ランタイム

影響を受ける API

ASP.NET 正しくないマルチパート処理により、フォーム データが失われる場合がある。

説明

.NET Framework 4.7.2 以前のバージョンをターゲットとするアプリケーションでは、ASP.NET でマルチパート境界の値が正しく解析されないために、要求の実行中にフォーム データが使用できなくなる場合があります。 .NET Framework 4.8 以降のバージョンをターゲットとするアプリケーションではマルチパート データが正しく解析されるため、要求の実行中にフォーム値を使用することができます。

提案される解決策

.NET Framework 4.8 以降で実行されているアプリケーションで、Framework 4.8 以降をターゲットとする場合は、targetFrameworkVersion 要素を使用して、区切り記号を削除するように既定の動作を変更します。 以前のフレームワークのバージョンをターゲットとするか、targetFrameworkVersion を使用しない場合、一部の値の末尾の区切り記号が引き続き返されます。

この動作は、appSetting で明示的に制御することもできます。

<configuration>
<appSettings>
...
<add key="aspnet:UseLegacyMultiValueHeaderHandling"  value="true"/>
...
</appSettings>
</configuration>
名前
スコープ 不明
バージョン 4.8
種類 ランタイム

影響を受ける API

ASP.NET カスタムの DataAnnotations.ValidationAttribute を使用すると、ValidationContext.MemberName が NULL にならない

説明

.NET Framework 4.7.2 以前のバージョンでは、カスタムの System.ComponentModel.DataAnnotations.ValidationAttribute を使用すると、ValidationContext.MemberName プロパティで null が返されます。 October 2019 Update より前の .NET Framework 4.8 バージョンでは、メンバー名が返されます。 .NET Framework 4.8 の .NET Framework October 2019 Preview の品質ロールアップ以降、既定では null が返されますが、代わりにメンバー名を返すように設定することもできます。

提案される解決策

.NET Framework 4.8 以降のバージョン用の .NET Framework October 2019 Preview の品質ロールアップで、メンバー名を返すプロパティに対して次の設定を web.config ファイルに追加します。

<configuration>
<appSettings>
...
<add key="aspnet:GetValidationMemberName"  value="true"/>
...
</appSettings>
</configuration>

October 2019 Update より前の .NET Framework 4.8 バージョンでは、これを web.config ファイルに追加すると、以前の動作が復元され、プロパティで null が返されます。

Name
スコープ 不明
バージョン 4.8
種類 ランタイム

影響を受ける API

コア

.NET COM では、イベント時に ByRef SafeArray パラメーターを正常にマーシャリングします。

説明

.NET Framework 4.7.2 以前のバージョンでは、COM イベントでの ByRef SafeArray パラメーターは、ネイティブ コードに戻ってマーシャリングすることはできません。 この変更により、SafeArray が正常にマーシャリングされるようになりました。

  • [ x ] 後方互換

提案される解決策

COM イベント時に ByRef SafeArray パラメーターを正常にマーシャリングすると、実行が中断されてしまう場合は、アプリケーション構成に次の構成スイッチを追加して、このコードを無効にすることができます。

<appSettings>
  <add key="Switch.System.Runtime.InteropServices.DoNotMarshalOutByrefSafeArrayOnInvoke" value="true" />
</appSettings>
名前
スコープ マイナー
バージョン 4.8
種類 ランタイム

影響を受ける API

API 分析では検出できません。

.NET 相互運用で IAgileObject に対して QueryInterface が呼び出されるようになる (WinRT インターフェイス)

説明

.NET デリゲートで WinRT イベントを使用する場合、.NET Framework 4.8 以降では、Windows で IAgileObject に対して QI が呼び出されます。 .NET Framework の以前のバージョンでは、ランタイムでその QI が失敗し、イベントをサブスクライブできませんでした。

  • [ x ] 後方互換

提案される解決策

IAgileObject に対して QI を有効にすると実行が中断される場合は、次の構成を設定し、このコードを無効にすることができます。

方法 1:環境変数

環境変数を COMPLUS_DisableCCWSupportIAgileObject=1 に設定します。

この方法は、この環境変数を継承するすべての環境に影響します。 この場合、コンソール セッションが 1 つのみになる可能性があります。あるいは、環境変数をグローバルに設定した場合、コンピューター全体に影響する可能性があります。 環境変数の名前では大文字と小文字は区別されません。

方法 2:レジストリ

レジストリ エディター (regedit.exe) を使用して、次のいずれかのサブキーを見つけます。

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework
  • HKEY_CURRENT_USER\SOFTWARE\Microsoft.NETFramework

さらに次のエントリを追加します:

名前: DisableCCWSupportIAgileObject 型: DWORD (32 ビット) 値 (REG_DWORD とも呼ばれる) データ: 1

Windows REG.EXE ツールを使用して、コマンド ラインまたはスクリプト環境から、この値を追加することができます。 次に例を示します。

reg add HKLM\SOFTWARE\Microsoft.NETFramework /v DisableCCWSupportIAgileObject /t REG_DWORD /d 1

ここでは、HKLMHKEY_LOCAL_MACHINE の代わりに使用されています。 この構文のヘルプを表示するには、reg add /? を使用します。 レジストリ値の名前では大文字と小文字は区別されません。

名前
スコープ エッジ
バージョン 4.8
種類 ランタイム

影響を受ける API

API 分析では検出できません。

Windows Communication Foundation (WCF)

svcTraceViewer ComboBox のハイ コントラストの変更

説明

Microsoft Service Trace Viewer ツールでは、特定のハイ コントラストのテーマで ComboBox コントロールが適切な色で表示されませんでした。 この問題は .NET Framework 4.7.2 で修正されました。 しかし、.NET Framework SDK の下位互換性要件により、既定ではお客様に修正が示されませんでした。 .NET 4.8 では、次の AppContext 構成スイッチを svcTraceViewer.exe.config ファイルに追加することで、この変更が示されます。

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

提案される解決策

ハイ コントラストの動作を変更したくない場合は、svcTraceViewer.exe.config ファイルから次のセクションを削除することで、無効にすることができます。

<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false" />
名前
スコープ エッジ
バージョン 4.8
種類 ランタイム

影響を受ける API

API 分析では検出できません。

Windows Presentation Foundation (WPF)

KeyedCollection のデータ バインディングの機能強化

詳細

ソース オブジェクトが同じシグネチャを持つカスタム インデクサーを宣言するときのBindingによる IList インデクサーの不適切な使用を修正しました (例: KeyedCollection<int,TItem>)。

サジェスチョン

古いバージョンを対象とするアプリケーションがこの変更の恩恵を受けるには、.NET Framework 4.8 以降上で実行する必要があります。また、次の AppContext スイッチをアプリ構成ファイルの <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.System.Windows.Data.Binding.IListIndexerHidesCustomIndexer=false" />
</runtime>
</configuration>
名前
スコープ Major
バージョン 4.8
種類 ランタイム

影響を受ける API

API 分析では検出できません。

重複する値型が含まれている ListBox が応答を停止する問題の修正

詳細

Items コレクションに重複する値型オブジェクトが含まれている場合、ItemsControl の仮想化がスクロール中に応答を停止する可能性がある問題を修正しました。

名前
スコープ Major
バージョン 4.8
種類 ランタイム

影響を受ける API

API 分析では検出できません。

グリッド スター行領域の割り当てアルゴリズムの改善

説明

.NET Framework 4.7 で導入された Gridサイズを割り当てるためのアルゴリズム) のバグを修正しました。 空の行を含む Height=&quot;Auto&quot; のグリッドなど、場合によっては、行が正しくない位置に配置され、すべてグリッドの外側に示されることがありました。

提案される解決策

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

名前
スコープ Major
バージョン 4.8
種類 ランタイム

影響を受ける API

API 分析では検出できません。

説明

ItemsControl の選択項目ではない項目内のハイパーリンクにフォーカスがあるときに矢印キーを押すと不適切な結果になる問題を修正しました。

名前
スコープ Major
バージョン 4.8
種類 ランタイム

影響を受ける API

API 分析では検出できません。

ItemsControl をグループ化するためのオートメーション ツリーのパフォーマンス向上

説明

グループ化が有効な ListBox や DataGrid などの ItemsControl のオートメーション ツリーの再構築のパフォーマンスが向上しました。

名前
スコープ Major
バージョン 4.8
種類 ランタイム

影響を受ける API

API 分析では検出できません。

.NET Framework 4.8.1

.NET Framework 4.8.1 では、アプリの互換性の問題は生じませんでした。