ContentRootPath för appar som startas av Windows Shell

Egenskapen IHostEnvironment.ContentRootPath representerar standardkatalogen där appsettings.json och andra innehållsfiler läses in i ett värdbaserat program, inklusive ASP.NET appar. Den här egenskapens värde är standardvärdet Environment.CurrentDirectory, vilket är programmets aktuella arbetskatalog. Det här beteendet gör att samma app kan köras under olika arbetskataloger och använda innehållet från varje katalog.

När en Windows-process (antingen program eller tjänst) startas utan att en arbetskatalog anges används arbetskatalogen för den process som skapade den . Arbetskatalogen för Windows Shell eller services.exe är %windir%\system32 (eller specialmappen System ). När någon av dessa processer startar en värdbaserad app ContentRootPath är egenskapen inställd på %windir%\system32.

Det här beteendet är förvirrande och gör att värdbaserade program misslyckas eftersom programmet försöker läsa in filer från katalogen%windir%\system32 , men det finns inte. Det går till exempel inte att hitta appsettings.json-filen under körning och inställningarna tillämpas inte.

Från och med .NET 7, när ett värdbaserat program startas med den aktuella katalogen inställd på specialmappen System, ställs ContentRootPath-egenskapen automatiskt in på AppContext.BaseDirectory.

Version lanserad

.NET 7

Tidigare beteende

Host.CreateDefaultBuilder angav ContentRootPath-egenskapen som standardvärde till Environment.CurrentDirectory, oavsett värdet i den aktuella katalogen.

Nytt beteende

Host.CreateDefaultBuilder inte längre standardinställningen för ContentRootPath egenskapen till den aktuella katalogen om det är specialmappen System i Windows. I stället används programmets baskatalog.

Typ av brytande ändring

Den här ändringen kan påverka binär kompatibilitet.

Orsak till ändring

Apputvecklare förväntade sig ContentRootPath inte att vara C:\Windows\system32 när deras program startades av Windows i vissa fall (till exempel när appen paketerades som en MSIX eller startades från Start-menyn). I dessa fall är det bättre att sätta ContentRootPath-egenskapen till programmets baskatalog som standard.

Om du vill använda det tidigare beteendet kan du ange ContentRootPath egenskapen explicit när du IHostBuilderskapar :

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

Berörda API:er