.NET Framework 4.6.2 を対象とするアプリ以降、.NET Framework でのパス正規化が変更されました。
パス正規化とは
パスを正規化するには、ターゲット オペレーティング システム上の有効なパスに準拠するように、パスまたはファイルを識別する文字列を変更する必要があります。 通常、正規化では次のことを行います。
コンポーネントとディレクトリの区切り記号を正規化する。
現在のディレクトリを相対パスに適用する。
パス内の相対ディレクトリ (
.
) または親ディレクトリ (..
) の評価。指定した文字をトリミングする。
変更
.NET Framework 4.6.2 を対象とするアプリ以降、パスの正規化は次の方法で変更されました。
ランタイムはオペレーティング システムの GetFullPathName 関数に従って、パスを正規化します。
正規化では、ディレクトリ セグメントの末尾 (ディレクトリ名の末尾のスペースなど) がトリミングされなくなりました。
\\.\
や\\?\
(mscorlib.dll のファイル I/O API の場合) を含む、完全に信頼できるデバイス パス構文がサポートされます。ランタイムではデバイス構文パスは検証されません。
代替データ ストリームにアクセスするためのデバイス構文の使用はサポートされています。
インパクト
.NET Framework 4.6.2 以降を対象とするアプリの場合、これらの変更は既定でオンになっています。 メソッドが以前にアクセスできないパスにアクセスできるようにしながら、パフォーマンスを向上させる必要があります。
.NET Framework 4.6.1 以前のバージョンを対象とするアプリが .NET Framework 4.6.2 以降で実行される場合、この変更の影響は受けません。
緩和策
.NET Framework 4.6.2 以降を対象とするアプリは、この変更をオプトアウトし、アプリケーション構成ファイルの <runtime> セクションに次のコードを追加することで、レガシ正規化を使用できます。
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true" />
</runtime>
.NET Framework 4.6.1 以前を対象とするが、.NET Framework 4.6.2 以降で実行されているアプリでは、アプリケーション .configuration ファイルの <runtime> セクションに次の行を追加することで、パス正規化の変更を有効にすることができます。
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
</runtime>
こちらも参照ください
.NET