缓解:路径规范化
自面向 .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 或更高版本上运行的应用,可通过将以下行添加到应用程序配置文件的 <runtime> 部分,启用对路径规范化的更改:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
</runtime>