缓解:路径规范化

从面向 .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>  
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true" />
</runtime>  

面向 .NET Framework 4.6.1 或更高版本但运行在 .NET Framework 4.6.2 或更高版本上的应用可以通过将以下行添加到 <应用程序 .configuration 文件的运行时> 部分来启用路径规范化更改:

<runtime>  
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
</runtime>  

另请参阅