ContentRootPath pour les applications lancées par Windows Shell

La propriété IHostEnvironment.ContentRootPath 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. La valeur de cette propriété est Environment.CurrentDirectory par défaut, qui est le répertoire de travail actuel de l’application. Ce comportement permet à la même application d’être exécutée dans des répertoires de travail différents et d’utiliser le contenu de chaque répertoire.

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

Ce comportement est confus et entraîne l’échec des applications hébergées, car l’application tente de charger des fichiers à partir du répertoire %windir%\system32, mais il 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.

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

Version introduite

.NET 7

Comportement précédent

Host.CreateDefaultBuilder a défini par défaut la propriété ContentRootPath sur Environment.CurrentDirectory, quelle que soit la valeur du répertoire actif.

Nouveau comportement

Host.CreateDefaultBuilder n’utilise plus par défaut la propriété ContentRootPath sur le répertoire actif s’il s’agit du dossier spécial System sur Windows. Au lieu de cela, c’est le répertoire de base de l’application qui est utilisé.

Type de changement cassant

Ce changement peut affecter la compatibilité binaire.

Raison du changement

Les développeurs d’applications ne s’attendaient pas que ContentRootPath soit 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 ce cas, il est préférable de choisir par défaut la propriété ContentRootPath 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é ContentRootPath explicitement lors de la création de IHostBuilder :

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

API affectées