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.
Action recommandée
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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour