Windows Shell에서 시작되는 앱에 대한 ContentRootPath

IHostEnvironment.ContentRootPath 속성은 ASP.NET 앱을 포함하여 호스트된 애플리케이션에 appsettings.json 및 기타 콘텐츠 파일이 로드되는 기본 디렉터리를 나타냅니다. 이 속성 값의 기본값은 애플리케이션의 현재 작업 디렉터리인 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로 설정했습니다.

새 동작

Host.CreateDefaultBuilder는 Windows의 System 특수 폴더인 경우 더 이상 ContentRootPath 속성을 현재 디렉터리로 기본 설정하지 않습니다. 대신 애플리케이션의 기본 디렉터리가 사용됩니다.

호환성이 손상되는 변경의 형식

이 변경은 이진 호환성에 영향을 줄 수 있습니다.

변경 이유

앱 개발자는 특정한 경우(예: 앱이 MSIX로 패키징되었거나 시작 메뉴에서 시작된 경우)에 Windows에서 애플리케이션을 시작할 때 ContentRootPathC:\Windows\system32일 것이라고 예상하지 않았습니다. 이러한 경우에는 ContentRootPath 속성을 애플리케이션의 기본 디렉터리로 기본 설정하는 것이 더 좋습니다.

이전 동작을 사용하려면 IHostBuilder를 만들 때 ContentRootPath 속성을 명시적으로 설정할 수 있습니다.

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

영향을 받는 API