共用方式為


以 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 啟動應用程式時,應用程式開發人員不會預期 ContentRootPathC:\Windows\system32 (例如應用程式封裝為 MSIX,或從 [開始] 功能表啟動時)。 在這些案例中,最好將 ContentRootPath 屬性預設為應用程式的基底目錄。

如果您想使用先前的行為,可在建立 IHostBuilder 時明確設定 ContentRootPath 屬性:

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

受影響的 API