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.CreateDefaultBuilder 将 ContentRootPath 属性默认为 Environment.CurrentDirectory,而不考虑当前目录的值。
新行为
如果当前目录是 Windows 上的 System
特殊文件夹,则 Host.CreateDefaultBuilder 不会再将 ContentRootPath 属性默认为当前目录, 而是使用应用程序的基目录。
中断性变更的类型
此项更改可能会影响二进制兼容性。
更改原因
当应用程序在某些情况下被 Windows 启动时(例如,当应用被打包为 MSIX 或从“开始”菜单启动时),应用程序开发人员并不希望 ContentRootPath 为 C:\Windows\system32。 在这些情况下,最好将 ContentRootPath 属性默认为应用程序的基目录。
建议的操作
如果要使用以前的行为,可以在创建 IHostBuilder 时显式设置 ContentRootPath
属性:
Host
.CreateDefaultBuilder()
.UseContentRoot(Environment.CurrentDirectory)
....