Compartir a través de


Las aplicaciones específicas del entorno de ejecución ya no están independientes

Las aplicaciones específicas del entorno de ejecución o las aplicaciones de .NET con RuntimeIdentifier ya no son autocontenidas de forma predeterminada. En su lugar, dependen del marco de forma predeterminada.

Este es un cambio importante en las siguientes situaciones:

  • Si implementó, distribuyó o publicó la aplicación y no agredía explícitamente la SelfContained propiedad, pero tampoco requería que el entorno de ejecución de .NET se instalara en la máquina para que funcione. En este caso, es posible que haya confiado en el comportamiento anterior para generar una aplicación independiente de forma predeterminada.
  • Si depende de la herramienta IL Link. En este caso, siga los pasos descritos en Acción recomendada para volver a usar IL Link.

Comportamiento anterior

Anteriormente, si se especificó un identificador en tiempo de ejecución (RID) (a través de RuntimeIdentifier), la aplicación se publicó como independiente, incluso si SelfContained no se especificó explícitamente.

Además:

  • Si PublishSelfContained no se estableció explícitamente en false, las propiedades de publicación PublishSingleFile y PublishAot implicaban un RuntimeIdentifier y, por tanto, un SelfContained (si no se especificaba) durante las operaciones, incluidas dotnet build, dotnet restore, y dotnet publish.
  • La PublishTrimmed propiedad no implicaba SelfContained.
  • La propiedad PublishReadyToRun implicaba SelfContained si no se especificaba SelfContained.

Nuevo comportamiento

A partir de .NET 8, para las aplicaciones que tienen como destino .NET 8 o una versión posterior, RuntimeIdentifier ya no implica SelfContained de forma predeterminada. En su lugar, las aplicaciones que especifican un identificador en tiempo de ejecución dependen del entorno de ejecución de .NET de forma predeterminada (dependiente del marco). Las aplicaciones destinadas a .NET 7 o versiones anteriores no se ven afectadas.

Además:

  • Si PublishSelfContained no se establece explícitamente en false, las propiedades de publicación PublishSingleFile y PublishAot ahora implican SelfContained (si no lo especifica) solo durante dotnet publish (es decir, no para dotnet build o dotnet restore).
  • La PublishTrimmed propiedad también ahora implica SelfContained durante dotnet publish.
  • La PublishReadyToRun propiedad ya no implica SelfContained si el proyecto tiene como destino .NET 8 o posterior.

Nota:

Si publicas con msbuild /t:Publish y quieres que la aplicación sea independiente, debes especificar SelfContainedexplícitamente , incluso si el proyecto tiene una de las propiedades de publicación enumeradas.

Versión introducida

.NET 8 (versión preliminar 5)

Tipo de cambio disruptivo

Este cambio puede afectar a la compatibilidad de origen y la compatibilidad binaria.

Motivo del cambio

  • El nuevo comportamiento del SDK de .NET se alinea con el comportamiento de Visual Studio.
  • Las aplicaciones dependientes del marco son más pequeñas de forma predeterminada, ya que no hay copias de .NET almacenadas en cada aplicación.
  • Cuando .NET se administra fuera de la aplicación (es decir, para implementaciones dependientes del marco), .NET permanece más seguro y actualizado. Las aplicaciones que tienen su propia copia del entorno de ejecución no obtienen actualizaciones de seguridad. Este cambio hace que más aplicaciones dependan del marco de trabajo de forma predeterminada.
  • Idealmente, las opciones de línea de comandos son ortogonales. En este caso, las herramientas admiten tanto la implementación independiente específica del RID (SCD) como la implementación dependiente del marco específica del RID (FDD). Por lo tanto, no tenía sentido que Ningún RID predeterminado se convirtiera en FDD y que los RID predeterminados se convirtieran en SCD. Este comportamiento a menudo resultaba confuso para los usuarios.

.NET 6 alertó a los usuarios a este cambio importante con la siguiente advertencia:

advertencia NETSDK1179: Se requiere una de las opciones "--self-contained" o "--no-self-contained" cuando se usa "--runtime".

Ahora que los clientes han tenido tiempo de agregar SelfContained explícitamente, es adecuado establecer la pausa.

  • Si usa .NET 7 o una versión anterior y dependía del comportamiento previo, en el que se infería SelfContained, verá esta advertencia:

    En el caso de los proyectos con TargetFrameworks >= 8.0, RuntimeIdentifier ya no proporciona automáticamente una aplicación SelfContained. Para seguir creando una aplicación independiente de .NET Framework después de actualizar a la versión 8.0, considere la posibilidad de establecer SelfContained explícitamente.

    Siga las instrucciones de la advertencia y declare la aplicación como independiente. Puede hacerlo en el archivo del proyecto o como argumento de línea de comandos, por ejemplo, dotnet publish --self-contained.

  • Si usa .NET 8 y desea mantener el comportamiento anterior, establezca SelfContained a true de la misma manera que se ha descrito anteriormente.

Establezca la propiedad de archivo de proyecto

SelfContained es una propiedad de MSBuild que puede insertar en el archivo de proyecto, que es un archivo que tiene una extensión .csproj, .vbproj o .fsproj . Establezca la propiedad de la siguiente manera:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    ...
    <SelfContained>true</SelfContained>
  </PropertyGroup>
</Project>

Consulte también