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

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

.NET Framework 4.5

ASP.NET

MachineKey.Encode メソッドと MachineKey.Decode メソッドが廃止に

説明

これらのメソッドは今後使用しません。 これらのメソッドを呼び出すコードをコンパイルすると、コンパイラ警告が生成されます。

提案される解決策

別の方法として、Protect(Byte[], String[]) および Unprotect(Byte[], String[]) を使用することをお勧めします。 または、ビルド警告を抑制するか、古いコンパイラを使用して警告を回避できます。 API は、まだサポートされています。

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

影響を受ける API

AntiXSSEncoder を使用するときの複数行の ASP.NET TextBox の間隔が変更

説明

.NET Framework 4.0 では、System.Web.Security.AntiXss.AntiXssEncoder を使用する場合、ポストバックの複数行テキスト ボックスの行間に余分な行が挿入されました。 .NET Framework 4.5 では、これらの余分な改行は含まれませんが、web アプリが .NET Framework 4.5 を対象としている場合に限ります。

提案される解決策

4\.0 の Web アプリの対象を .NET Framework 4.5 に変更すると、複数行テキスト ボックスが改善され、余分な改行が挿入されなくなります。 これが望ましくない場合は、.NET Framework 4.0 を対象とすることによって、アプリを .NET Framework 4.5 で実行するときにも以前の動作が可能です。

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

WebUtility.HtmlEncode と WebUtility.HtmlDecode で BMP が正常に往復する

説明

.NET Framework 4.5 を対象とするアプリケーションの場合、基本多言語面 (BMP: Basic Multilingual Plane) の外部にある文字は、HtmlDecode(String) メソッドに渡されたときに正常に往復します。

提案される解決策

この変更は現在のアプリケーションには影響を与えないはずですが、元の動作を復元するには、<httpRuntime> 要素の targetFramework 属性を "4.5" 以外の文字列に設定します。 また、.NET Framework の対象バージョンに関係なくこの動作を制御するために unicodeEncodingConformance 構成要素の unicodeDecodingConformance 属性と <webUtility> 属性を設定することもできます。

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

影響を受ける API

ClickOnce

SHA-256 コード署名証明書を使用する ClickOnce で発行されたアプリケーションは、Windows 2003 では失敗することがある

説明

この実行可能ファイルは SHA256 で署名されます。 以前は、コード署名証明書が SHA-1 か SHA-256 に関係なく、SHA 1 で署名されました。 この方法は、次の対象に適用されます。

  • Visual Studio 2012 以降でビルドされたすべてのアプリケーション。
  • .NET Framework 4.5 がインストールされているシステム上で、Visual Studio 2010 以前でビルドされたアプリケーション。 さらに、.NET Framework 4.5 以降が存在する場合、コンパイル対象となった .NET Framework のバージョンに関係なく、ClickOnce マニフェストはSHA-256 証明書の SHA 256 で署名されます。

提案される解決策

ClickOnce 実行可能ファイルの署名方法に関するこの変更は、Windows Server 2003 システムにのみ影響を及ぼします。これらのシステムには、KB 938397 をインストールする必要があります。 アプリが .NET Framework 4.0 以前のバージョンをターゲットとしている場合でも、SHA-256 を使用したマニフェストの署名方法の変更により、.NET Framework 4.5 以降のバージョンに対するランタイム依存関係が導入されます。

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

コア

foreach 反復子変数は、イテレーション内をスコープとするようになったため、クロージャ キャプチャのセマンティクスが (C#5 では) 異なります。

説明

C#5 (Visual Studio 2012) 以降では、foreach 反復子変数は、イテレーション内をスコープとします。 このため、変数が foreach のクロージャに含まれないことに依存していたコードは機能しなくなります。 この変更による症状は、デリゲートに渡された反復子変数が、デリゲートが呼び出された時点での値ではなく、デリゲートの作成時点での値として扱われることです。

提案される解決策

理想的には、新しいコンパイラの動作を予期するように、コードを更新する必要があります。 古いセマンティクスが必要な場合は、反復子変数を、ループのスコープ外に明示的に配置される別の変数に置き換えることができます。

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

IAsyncResult.CompletedSynchronously プロパティが正しくなければ、結果のタスクは完了しません

説明

TaskFactory.FromAsync を呼び出すとき、CompletedSynchronously プロパティの実装が正しくなければ、結果のタスクは完了しません。 つまり、実装が同期的に完了した場合にのみ、このプロパティは true を返す必要があります。 以前は、このプロパティは確認されていませんでした。

提案される解決策

タスクが同期的に完了したときにのみ、System.IAsyncResult の実装が System.IAsyncResult.CompletedSynchronously プロパティに true を返す場合、中断は発生しません。 ユーザーは、所有する System.IAsyncResult の実装 (ある場合) を見直して、タスクが同期的に完了したかどうかを正しく評価することを確認する必要があります。

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

影響を受ける API

List<T>.ForEach は、リスト項目を変更すると、例外をスローすることがあります。

説明

.NET Framework 4.5 から、ForEach(Action<T>) 列挙子は、呼び出し元のコレクション内の要素が変更された場合、System.InvalidOperationException 例外をスローします。 以前は、この様な場合、例外はスローされませんでしたが、競合状態になることがありました。

提案される解決策

理想的には、安全な操作ではないため、要素の列挙中にリストを変更しないようにコードを修正する必要があります。 ただし、以前の動作に戻すには、アプリを .NET Framework 4.0 向けにできます。

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

影響を受ける API

System.Uri 解析が RFC 3987 に準拠

説明

.NET Framework 4.5 では、URI 解析がいくつかの点で変更されました。 ただし、これらの変更は .NET Framework 4.5 を対象としたコードのみに影響することに注意してください。 バイナリが .NET Framework 4.0 を対象としている場合、以前の動作が実行されます。 .NET Framework 4.5 での URI 解析の変更は次のとおりです。

  • URI 解析は、RFC 3987 の最新の IRI 規則に従って、正規化と文字チェックを実行します。
  • Unicode 正規化フォーム C は、URI のホスト部分でのみ実行されます。
  • 無効な mailto:URI は、例外の原因になります。
  • パス セグメントの最後の末尾のドットが保存されるようになりました。
  • file:// URI は ? 文字をエスケープしません。
  • Unicode 制御文字の U+0080 から U+009F まではサポートされません。
  • コンマ文字 , または %2c は自動的にエスケープ解除されません。

提案される解決策

古い .NET Framework 4.0 URI 解析セマンティクスが必要な場合 (めったにありません)、.NET Framework 4.0 を対象とすることによって使用できます。 これは、アセンブリで System.Runtime.Versioning.TargetFrameworkAttribute を使用することによって、または、[プロジェクトのプロパティ] ページの Visual Studio のプロジェクト システム UI によって実現できます。

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

影響を受ける API

最初のセグメントにコロン文字を含む相対 URI に対して System.Uri.IsWellFormedUriString メソッドが false を返す

説明

.NET Framework 4.5 より、IsWellFormedUriString(String, UriKind) では、最初のセグメントに : を含む相対 URI が形式が正しくないとして処理されます。 これは .NET Framework 4.0 の System.Uri.IsWellFormedUriString(String, UriKind) 動作からの変更であり、RFC3986 に準拠する目的で行われました。

提案される解決策

この変更は (他の多くの URI 変更と同様に) .NET Framework 4.5 (以降) を対象とするアプリケーションにのみ影響を与えます。 以前の動作を維持するには、アプリの対象を .NET Framework 4.0 にします。 あるいは、System.Uri.IsWellFormedUriString(String, UriKind) を呼び出す前に URI を調べて : 文字を探し、以前の動作が望ましければそれを削除し、正しい形式として処理させます。

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

影響を受ける API

Entity Framework

Entity Framework バージョンは .NET Framework バージョンに一致する必要がある

説明

Entity Framework (EF) のバージョンは、.NET Framework のバージョンと一致している必要があります。 .NET Framework 4.5 には、Entity Framework 5 をお勧めします。 .NET Framework 4.5 プロジェクトの EF 4.x に System.ComponentModel.DataAnnotations に関する既知の問題がいくつかあります。 .NET Framework 4.5 では、これらは別のアセンブリに移動されたため、どの注釈を使用するかを決めるという問題があります。

提案される解決策

.NET Framework 4.5 の場合、Entity Framework 5 にアップグレードする

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

Windows フォーム

EncoderParameter ctor が廃止に

説明

EncoderParameter(Encoder, Int32, Int32, Int32, Int32) コンストラクターは廃止され、使用された場合、ビルド警告が発生します。

提案される解決策

コンストラクター EncoderParameter(Encoder, Int32, Int32, Int32, Int32) は引き続き動作しますが、.NET Framework 4.5 のツールでコードを再コンパイルするときに古いビルド警告を回避するには、コンストラクター EncoderParameter(Encoder, Int32, EncoderParameterValueType, IntPtr) を代わりに使用する必要があります。

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

影響を受ける API

Windows Communication Foundation (WCF)

BodyWriter を使ったバイナリ出力の書き込み

詳細

クラス System.ServiceModel.Channels.BodyWriter から派生し、OnWriteBodyContents(XmlDictionaryWriter writer) の実装を使ってバイナリ出力を書き込んでいる場合、.NET Framework 4.5 に再ターゲットするときに、いくつかの変更が必要になる場合があります。 書き込み状態を確認し、それが WriterState.Start の場合は、次のコード スニペットに示すように Binary でラップする XML 要素を出力します。

protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
{
    bool wroteStartElement = false;
    if (writer.WriteState == WriteState.Start)
    {
        writer.WriteStartElement("Binary", string.Empty);
        wroteStartElement = true;
    }
    writer.WriteBase64(buffer, offset, count);
    if (wroteStartElement)
    {
        writer.WriteEndElement();
    }
}

さらに、クラス System.ServiceModel.Channels.StreamBodyWriter から派生していてメソッド OnWriteBodyContents(XmlDictionaryWriter writer) をオーバーライドしている場合は、いくつかの変更が必要になる場合があります。 .NET Framework 4.0 をターゲットとする場合、このメソッドをオーバーライドするときに Binary 要素を明示的に記述する必要がありました。 .NET Framework 4.5 をターゲットにする場合、これは不要になり、これを行うと本文が書き込まれなくなります。

Windows Presentation Foundation (WPF)

WPF TextBox.Text とデータ バインドを非同期にできる

説明

場合によっては、データ バインディングの書き込み操作中にプロパティが変更された場合、Text プロパティにデータ バインディング プロパティ値の以前の値が反映されることがあります。

提案される解決策

これによって生じる悪影響はないはずです。 ただし、KeepTextBoxDisplaySynchronizedWithTextProperty プロパティを false に設定して、以前の動作を復元することは可能です。

Value
スコープ エッジ
Version 4.5
Type 再ターゲット中

影響を受ける API

Windows Workflow Foundation (WF)

新しい (あいまいな) Dispatcher.Invoke オーバーロードが、異なる動作になる可能性がある

説明

.NET Framework 4.5 では、Action 型のパラメーターを含む Dispatcher.Invoke に新しいオーバーロードが追加されます。 既存のコードを再コンパイルすると、コンパイラは、Delegate パラメーターを持つ Dispatcher.Invoke メソッドの呼び出しを、Action パラメーターを持つ Dispatcher.Invoke メソッドの呼び出しとして解決することができます。 Delegate パラメーターを持つ Dispatcher.Invoke オーバーロードの呼び出しが Action パラメーターを持つ Dispatcher.Invoke オーバーロードの呼び出しとして解決された場合、次のような動作の差異が生じることがあります。

提案される解決策

あいまいさ (および例外処理またはブロック動作における考えられる相違点) を回避するために、呼び出し元の Dispatcher.Invoke は Invoke 呼び出しの 2 番目のパラメーターとして空の object[] を渡すことで、.NET Framework 4.0 メソッドのオーバーロードに解決されるようにできます。

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

影響を受ける API

一部の WorkFlow ドラッグ アンド ドロップ API が廃止されました

説明

この WorkFlow ドラッグ アンド ドロップ API は廃止され、アプリが 4.5 向けにリビルドされた場合、コンパイラ警告が発生します。

提案される解決策

複数オブジェクトでの操作をサポートする新しい System.Activities.Presentation.DragDropHelper API を代わりに使用する必要があります。 または、ビルド警告を抑制するか、古いコンパイラを使用して警告を回避できます。 API は、まだサポートされています。

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

影響を受ける API

WorkFlow 3.0 タイプは廃止されました

説明

Windows Workflow Foundation (WWF) 3.0 API (System.Workflow 名前空間からのもの) は廃止されました。

提案される解決策

新しい WWF 4.0 API (System.Activities) を代わりに使用する必要があります。 新しい API の使用例はここにあり、詳しいガイダンスはここにあります。 または、WWF 3.0 API はまだサポートされているので、使用でき、ビルド時の警告は、警告を抑制することによって、または以前のコンパイラを使用することによって回避できます。

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

WorkflowDesigner.Load ではシンボル プロパティが削除されない

説明

ワークフロー デザイナーで .NET Framework 4.5 を対象とし、再ホストされた 3.5 ワークフローを Load() メソッドで読み込むと、ワークフローの保存中に System.Xaml.XamlDuplicateMemberException がスローされます。

提案される解決策

このバグは、ワークフロー デザイナーで .NET Framework 4.5 を対象とするときにのみ現れるため、WorkflowDesigner.Context.Services.GetService<DesignerConfigurationService>().TargetFrameworkName を 4.0 の .NET Framework に設定することによって回避できます。

または、Load() ではなく、Load(String) メソッドを使用してワークフローを読み込むことによって、問題を回避できる場合があります。

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

影響を受ける API

XML、XSLT

XML スキーマ検証がより厳格になりました

説明

.NET Framework 4.5 では、XML スキーマ検証が厳格化されました。 xsd:anyURI を使用して mailto プロトコルなどの URI を検証したときに、URI にスペースが入っていると検証は失敗します。 .NET Framework の以前のバージョンでは、検証は成功していました。 この変更は、.NET Framework 4.5 を対象とするアプリケーションにのみ影響します。

提案される解決策

より緩やかな .NET Framework 4.0 の検証が必要な場合、検証アプリケーションはバージョン 4.0 の .NET Framework をターゲットにできます。 もう一度 .NET Framework 4.5 をターゲットにする場合は、無効な URI (およびスペース) が anyURI データ型の属性値として予期されないように、コード レビューを行う必要があります。

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

.NET Framework 4.5.1

ADO.NET

DbParameter.Precision と DbParameter.Scale は、パブリック仮想メンバーになった

説明

Precision および Scale はパブリック仮想プロパティとして実装されます。 これらは、対応する明示的なインターフェイス実装、IDbDataParameter.PrecisionIDbDataParameter.Scale を置き換えます。

提案される解決策

ADO.NET データベース プロバイダーを再構築するとき、これらの違いにより、「override」キーワードが Precision および Scale プロパティに適用される必要があります。 これは、コンポーネントを再構築するときにのみ必要です。既存のバイナリは引き続き機能します。

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

影響を受ける API

コア

ObsoleteAttribute は、WinMD のシナリオで、ObsoleteAttribute と DeprecatedAttribute の両方としてエクスポートする

説明

Windows メタデータ ライブラリ (.winmd ファイル) を作成するとき、System.ObsoleteAttribute 属性は System.ObsoleteAttribute および Windows.Foundation.DeprecatedAttribute の両方としてエクスポートされます。

提案される解決策

System.ObsoleteAttribute 属性を使用する既存のソース コードを再コンパイルするとき、C++/CX または JavaScript からそのコードを使用するとき、警告が生成されることがあります。マネージド アセンブリのコードを記述するとき、System.ObsoleteAttributeWindows.Foundation.DeprecatedAttribute の両方を適用することはお勧めしません。ビルドで警告が生成されることがあります。

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

Entity Framework

Visual Studio 2013 で Entity Framework edmx をビルドすると、EntityDeploySplit または EntityClean タスクを使用している場合、エラー MSB4062 で失敗することがある

説明

MSBuild 12.0 ツール (Visual Studio 2013 に含まれる) は、MSBuild ファイルの位置を変更したため、古い Entity Framework のターゲット ファイルは無効になります。 その結果、EntityDeploySplit および EntityClean タスクは、Microsoft.Data.Entity.Build.Tasks.dll を見つけられないために失敗します。 このエラーは、ツールセット (MSBuild/VS) の変更によるものであり、.NET Framework の変更によるものではないことに注意してください。 開発者ツールをアップグレードしたときにのみ発生し、.NET Framework をアップグレード下だけでは発生しません。

提案される解決策

Entity Framework のターゲット ファイルは、.NET Framework 4.6 以降の新しい MSBuild レイアウトで機能するように修正されます。 このバージョンの Framework にアップグレードすることで、この問題は修正されます。 または、この回避策を使用して、ターゲット ファイルに直接パッチを当てることができます。

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

MSBuild

ResolveAssemblyReference タスクは、正しくないアーキテクチャとの依存関係に関する警告を表示するようになりました

説明

タスクは警告 MSB3270 を生成します。これは参照または依存関係がアプリのアーキテクチャと一致しないことを示します。 たとえば、AnyCPU オプションでコンパイルされたアプリに x86 参照が含まれる場合に発生します。 このようなシナリオは、実行時にアプリでエラーが起こった場合に発生することがあります (この場合は、アプリが x64 プロセスとして配置されている場合)。

提案される解決策

影響には 2 つの領域があります。

  • 再コンパイルすると、アプリが MSBuild の以前のバージョンでコンパイルされたときには現れなかった警告が生成されます。 ただし、警告はランタイム エラーの可能性のある原因を特定するため、調査と対処が必要です。
  • 警告がエラーとして扱われると、アプリはコンパイルされません。
名前
スコープ マイナー
バージョン 4.5.1
種類 再ターゲット中

Windows Presentation Foundation (WPF)

非パブリック セッターを持つプロパティへの双方向データ バインドはサポートされません

説明

パブリック セッターを持たないプロパティへのデータ バインドを試みることは、サポートされるシナリオではありません。 .NET framework 4.5.1 以降では、このシナリオでは System.InvalidOperationException がスローされます。 この新しい例外は、具体的に .NET Framework 4.5.1 を対象とするアプリでのみスローされることに注意してください。 アプリが .NET Framework 4.5 をターゲットとしている場合、この呼び出しは許されます。 アプリが特定のバージョンの .NET Framework をターゲットにしていない場合、バインドは一方向として扱われます。

提案される解決策

一方向のバインドを使用するか、プロパティのセッターを公開するように、アプリを更新する必要があります。 または、.NET Framework 4.5 をターゲットにすると、アプリは以前の動作を示すようになります。

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

影響を受ける API

.NET Framework 4.5.2

Visual Basic .NET

VB.NET は、System.Windows Api の部分的な名前空間の修飾をサポートしなくなりました

説明

.NET Framework 4.5.2 以降では、VB.NET プロジェクトは、部分的に修飾された名前空間で System.Windows API を指定できません。 たとえば、Windows.Forms.DialogResult の参照は失敗します。 代わりに、コードは、完全修飾名 (DialogResult) を参照するか、特定の名前空間をインポートして、System.Windows.Forms.DialogResult を参照する必要があります。

提案される解決策

System.Windows API を単純な名前で参照するか (および関連する名前空間をインポートする)、完全修飾名で参照するように、コードを更新する必要があります。

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

Windows フォーム

DataObject.GetData は、データを UTF-8 として取得するようになりました

説明

.NET Framework 4 を対象とするアプリまたは .NET Framework 4.5.1 以前のバージョンで実行されるアプリでは、DataObject.GetData は HTML 形式のデータを ASCII 文字列として取得します。 結果として、非 ASCII 文字 (ASCII コードが 0x7F よりも大きい文字) は 2 つのランダムな文字で表されます。

.NET Framework 4.5 以降を対象とするアプリ、および.NET Framework 4.5.2 で実行するアプリでは、DataObject.GetData は HTML 形式のデータを UTF-8 として取得し、これは、0x7F よりも大きい文字を正しく表します。

サジェスチョン

HTML 形式の文字列を使用するエンコーディングの問題に対する回避策 (例: クリップボードから取得した HTML 文字列を System.Text.UTF8Encoding.GetString(Byte[], Int32, Int32) に渡して明示的にエンコードすること) を実装し、アプリをバージョン 4 から 4.5 へ再ターゲットしている場合は、その回避策を削除する必要があります。何らかの理由で古い動作を必要とする場合は、アプリのターゲットを .NET Framework 4.0 にしてその動作を得ることができます。

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

影響を受ける API

Windows Workflow Foundation (WF)

WorkflowDesigner.Load ではシンボル プロパティが削除されない

説明

ワークフロー デザイナーで .NET Framework 4.5 を対象とし、再ホストされた 3.5 ワークフローを Load() メソッドで読み込むと、ワークフローの保存中に System.Xaml.XamlDuplicateMemberException がスローされます。

提案される解決策

このバグは、ワークフロー デザイナーで .NET Framework 4.5 を対象とするときにのみ現れるため、WorkflowDesigner.Context.Services.GetService<DesignerConfigurationService>().TargetFrameworkName を 4.0 の .NET Framework に設定することによって回避できます。

または、Load() ではなく、Load(String) メソッドを使用してワークフローを読み込むことによって、問題を回避できる場合があります。

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

影響を受ける API