Windows Shell 启动的应用的 ContentRootPath

IHostEnvironment.ContentRootPath 属性表示在托管应用程序中加载 appsettings.json 和其他内容文件的默认目录,包括 ASP.NET 应用。 此属性的默认值为 Environment.CurrentDirectory,这是应用程序的当前工作目录。 此行为允许在同一个应用在不同的工作目录下执行,并使用每个目录中的内容。

在未指定工作目录的情况下启动 Windows 进程(应用程序或服务)时,将使用创建它的进程的工作目录。 Windows Shell 或 services.exe 的工作目录是 %windir%\system32(或 System 特殊文件夹)。 当其中任一个进程启动托管应用时,ContentRootPath 属性将设置为 %windir%\system32。

此行为令人困惑,并会导致托管应用程序失败,因为应用程序尝试从 %windir%\system32 目录加载文件,但它并不存在。 例如,运行时找不到 appsettings.json 文件,并且不会应用设置。

从 .NET 7 开始,当托管应用程序启动,并将当前目录设置为 System 特殊文件夹时,它会将 ContentRootPath 属性默认为 AppContext.BaseDirectory

引入的版本

.NET 7

旧行为

Host.CreateDefaultBuilderContentRootPath 属性默认为 Environment.CurrentDirectory,而不考虑当前目录的值。

新行为

如果当前目录是 Windows 上的 System 特殊文件夹,则 Host.CreateDefaultBuilder 不会再将 ContentRootPath 属性默认为当前目录, 而是使用应用程序的基目录。

中断性变更的类型

此项更改可能会影响二进制兼容性

更改原因

当应用程序在某些情况下被 Windows 启动时(例如,当应用被打包为 MSIX 或从“开始”菜单启动时),应用程序开发人员并不希望 ContentRootPath 为 C:\Windows\system32。 在这些情况下,最好将 ContentRootPath 属性默认为应用程序的基目录。

如果要使用以前的行为,可以在创建 IHostBuilder 时显式设置 ContentRootPath 属性:

Host
    .CreateDefaultBuilder()
    .UseContentRoot(Environment.CurrentDirectory)
    ....

受影响的 API