以 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 啟動應用程式時,應用程式開發人員不會預期 ContentRootPath 為 C:\Windows\system32 (例如應用程式封裝為 MSIX,或從 [開始] 功能表啟動時)。 在這些案例中,最好將 ContentRootPath 屬性預設為應用程式的基底目錄。
建議的動作
如果您想使用先前的行為,可在建立 IHostBuilder 時明確設定 ContentRootPath
屬性:
Host
.CreateDefaultBuilder()
.UseContentRoot(Environment.CurrentDirectory)
....