Partager via


ContentRootPath pour les applications lancées par Windows Shell

La IHostEnvironment.ContentRootPath propriété représente le répertoire par défaut dans lequel appsettings.json et d’autres fichiers de contenu sont chargés dans une application hébergée, y compris les applications ASP.NET. Par défaut Environment.CurrentDirectory, la valeur de cette propriété est le répertoire de travail actuel de l’application. Ce comportement permet à la même application d’être exécutée sous différents répertoires de travail et d’utiliser le contenu de chaque répertoire.

Lorsqu’un processus Windows (application ou service) est lancé sans spécifier d’annuaire de travail, le répertoire de travail du processus créé est utilisé. Le répertoire de travail de Windows Shell ou services.exe est %windir%\system32 (ou le System dossier spécial). Lorsque l’un de ces processus lance une application hébergée, la ContentRootPath propriété est définie sur%windir%\system32.

Ce comportement est confus et provoque l’échec des applications hébergées, car l’application tente de charger des fichiers à partir du répertoire %windir%\system32 , mais elle n’existe pas. Par exemple, le fichier appsettings.json est introuvable au moment de l’exécution et les paramètres ne sont pas appliqués.

À partir de .NET 7, lorsque une application hébergée est lancée avec le répertoire courant défini sur le dossier spécial System, la propriété ContentRootPath est par défaut définie sur AppContext.BaseDirectory.

Version introduite

.NET 7

Comportement précédent

Host.CreateDefaultBuilder a défini la propriété ContentRootPath sur Environment.CurrentDirectory indépendamment de la valeur du répertoire actif.

Nouveau comportement

Host.CreateDefaultBuilder ne définit plus la propriété ContentRootPath par défaut sur le répertoire actuel s'il s'agit du dossier spécial System sous Windows. Au lieu de cela, le répertoire de base de l’application est utilisé.

Type de changement cassant

Cette modification peut affecter la compatibilité binaire.

Raison de la modification

Les développeurs d’applications ne s’attendaient ContentRootPath pas à être C :\Windows\system32 lorsque leur application a été lancée par Windows dans certains cas (par exemple, lorsque l’application a été empaquetée en tant que MSIX ou démarrée à partir du menu Démarrer). Dans ces cas, il est préférable de choisir par défaut la ContentRootPath propriété dans le répertoire de base de l’application.

Si vous souhaitez utiliser le comportement précédent, vous pouvez définir la propriété explicitement lors de la ContentRootPath création du IHostBuilder:

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

API affectées