ContentRootPath voor apps die zijn gestart door Windows Shell

De IHostEnvironment.ContentRootPath eigenschap vertegenwoordigt de standaardmap waarin appsettings.json en andere inhoudsbestanden worden geladen in een gehoste toepassing, inclusief ASP.NET-apps. De waarde van deze eigenschap is standaard ingesteld op Environment.CurrentDirectory, de huidige werkmap van de toepassing. Met dit gedrag kan dezelfde app worden uitgevoerd onder verschillende werkmappen en wordt de inhoud uit elke map gebruikt.

Wanneer een Windows-proces (toepassing of service) wordt gestart zonder een werkmap op te geven, wordt de werkmap gebruikt van het proces dat het heeft gecreëerd. De werkmap van de Windows-shell of services.exe is %windir%\system32 (of de speciale map System). Wanneer een van deze processen een gehoste app start, wordt de ContentRootPath eigenschap ingesteld op %windir%\system32.

Dit gedrag is verwarrend en zorgt ervoor dat gehoste toepassingen mislukken, omdat de toepassing bestanden probeert te laden uit de map%windir%\system32 , maar deze niet bestaat. Het appsettings.json-bestand is bijvoorbeeld niet gevonden tijdens runtime en de instellingen worden niet toegepast.

Vanaf .NET 7 wordt bij het starten van een gehoste toepassing met de huidige map ingesteld op de speciale map System, de eigenschap ContentRootPath standaard ingesteld op AppContext.BaseDirectory.

Geïntroduceerde versie

.NET 7

Vorig gedrag

Host.CreateDefaultBuilder heeft de eigenschap ContentRootPath standaard op Environment.CurrentDirectory ingesteld, ongeacht de waarde van de huidige map.

Nieuw gedrag

Standaard wordt de eigenschap Host.CreateDefaultBuilder niet meer ingesteld op de huidige map indien dit de ContentRootPath speciale map in Windows is. In plaats daarvan wordt de basismap van de toepassing gebruikt.

Type van brekende verandering

Deze wijziging kan van invloed zijn op binaire compatibiliteit.

Reden voor wijziging

App-ontwikkelaars verwachtten ContentRootPath niet C:\Windows\system32 te zijn toen hun toepassing in bepaalde gevallen door Windows werd gestart (bijvoorbeeld wanneer de app is verpakt als een MSIX of gestart vanuit het startmenu). In dergelijke gevallen is het beter om de ContentRootPath eigenschap standaard te gebruiken in de basismap van de toepassing.

Als u het vorige gedrag wilt gebruiken, kunt u de ContentRootPath eigenschap expliciet instellen wanneer u de IHostBuilder maakt.

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

Betreffende API's