ContentRootPath para aplicaciones iniciadas por Windows Shell

La propiedad IHostEnvironment.ContentRootPath representa el directorio predeterminado donde appsettings.json y otros archivos de contenido se cargan en una aplicación hospedada, incluidas aplicaciones de ASP.NET. El valor de esta propiedad tiene Environment.CurrentDirectory como valor predeterminado, que es el directorio de trabajo actual de la aplicación. Este comportamiento permite que la misma aplicación se ejecute en directorios de trabajo diferentes y use el contenido de cada directorio.

Cuando se inicia un proceso de Windows (ya sea aplicación o servicio) sin especificar un directorio de trabajo, se usa el directorio de trabajo del proceso que lo creó. El directorio de trabajo de Windows Shell o services.exe es %windir%\system32 (o la carpeta especial System). Cuando cualquiera de esos procesos inicia una aplicación hospedada, la propiedad ContentRootPath se establece en %windir%\system32.

Este comportamiento es confuso y hace que se produzcan errores en las aplicaciones hospedadas, ya que la aplicación intenta cargar archivos desde el directorio %windir%\system32, pero este no existe. Por ejemplo, el archivo appsettings.json no se encuentra en tiempo de ejecución y la configuración no se aplica.

A partir de .NET 7, cuando se inicia una aplicación hospedada con el directorio actual establecido en la carpeta especial System, el valor predeterminado de la propiedad ContentRootPath es AppContext.BaseDirectory.

Versión introducida

.NET 7

Comportamiento anterior

Host.CreateDefaultBuilder ponía el valor predeterminado de la propiedad ContentRootPath en Environment.CurrentDirectory, independientemente del valor del directorio actual.

Comportamiento nuevo

Host.CreateDefaultBuilder ya no establece de manera predeterminada la propiedad ContentRootPath en el directorio actual si se trata de la carpeta especial System en Windows. En su lugar, se usa el directorio base de la aplicación.

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad binaria.

Motivo del cambio

Los desarrolladores de aplicaciones no esperaban que ContentRootPath fuera C:\Windows\system32 cuando Windows inició su aplicación en determinados casos (por ejemplo, cuando la aplicación se empaquetó como MSIX o se inició desde el menú Inicio). En estos casos, es mejor establecer de manera predeterminada la propiedad ContentRootPath en el directorio base de la aplicación.

Si desea usar el comportamiento anterior, puede establecer la propiedad ContentRootPath explícitamente al crear IHostBuilder:

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

API afectadas