Es posible que no se use el recorte con .NET Standard o .NET Framework.
Los proyectos que establecen <PublishTrimmed>true</PublishTrimmed>
, <IsTrimmable>true</IsTrimmable>
o <EnableTrimAnalyzer>true</EnableTrimAnalyzer>
con un TargetFramework
que es cualquier versión de .NET Standard o .NET Framework generan una advertencia o error porque el recorte no es compatible con estas plataformas de destino.
Comportamiento anterior
Anteriormente, cuando se usa en un proyecto de .NET Standard o .NET Framework, esta configuración se comportaba de la siguiente manera:
<PublishTrimmed>true</PublishTrimmed>
no tuvo ningún efecto.<IsTrimmable>true</IsTrimmable>
insertó un atributo de nivel de ensamblado[assembly: AssemblyMetadata("IsTrimmable", "true")]
en el ensamblado de salida. Ese atributo optó por el ensamblado en el recorte cuando se consume en una aplicación recortada (incluso una aplicación que usa<TrimMode>partial</TrimMode>
).<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
habilitó el análisis de recorte para la biblioteca, mediante los ensamblados de referencia de .NET Standard o .NET Framework correspondientes a laTargetFramework
de la biblioteca, aunque estos ensamblados de referencia no estén anotados para el recorte.
Comportamiento nuevo
A partir del SDK de .NET 8, en un proyecto destinado a .NET Standard o .NET Framework:
<PublishTrimmed>
produce un error que indica que esta configuración no es compatible con la plataforma de destino.<IsTrimmable>
y<EnableTrimAnalyzer>
producen una advertencia que indica que<IsTrimmable>
no es compatible con la plataforma de destino. De lo contrario, esta configuración no tiene ningún efecto en la salida de la compilación.
Versión introducida
.NET 8 RC 1
Tipo de cambio importante
Este es un cambio de comportamiento.
Motivo del cambio
Permitir el uso de <PublishTrimmed>
en un proyecto de .NET Standard o .NET Framework podría haber dado la falsa impresión de que esta configuración estaba recortando la salida, cuando de hecho no tenía ningún efecto.
Permitir el uso de <IsTrimmable>
o <EnableTrimAnalyzer>
en un proyecto de .NET Standard o .NET Framework significaba que era fácil para los autores de bibliotecas activar el recorte, sin recibir alertas sobre las incompatibilidades del recorte. Dado que los ensamblados de referencia de .NET Standard y .NET Framework no están anotados para el recorte, no se han producido advertencias sobre los usos de las API de marco que no son compatibles con el recorte.
Acción recomendada
Evite establecer <PublishTrimmed>
en proyectos que tienen como destino .NET Standard o .NET Framework. Evite también establecer <PublishAot>
que implica la configuración anterior.
Evite establecer <IsTrimmable>
o <EnableTrimAnalyzer>
en bibliotecas destinadas a .NET Standard o .NET Framework. Evite también establecer <IsAotCompatible>
, lo que implica la configuración anterior. En su lugar, la biblioteca multi-destino para incluir los TargetFramework
más recientes y habilitar <IsTrimmable>
solo para las plataformas de destino admitidas. Al establecer <IsTrimmable>
ejecutará la versión más reciente del analizador de recorte mediante anotaciones de compatibilidad de recorte de la versión más reciente del marco.
Por ejemplo, esta configuración de varios destinos para incluir net8.0
y establecer <IsTrimmable>
solo para esta plataforma de destino. Esta lógica usa IsTargetFrameworkCompatible
para que se aplique a cualquier marco compatible con net6.0
, cuando se admita el recorte oficialmente. De este modo, no es necesario actualizar la condición al agregar nuevas plataformas de destino.
<PropertyGroup>
<TargetFrameworks>netstandard2.1;net8.0</TargetFrameworks>
<IsTrimmable Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net6.0'))">true</IsTrimmable>
</PropertyGroup>