Trimning får inte användas med .NET Standard eller .NET Framework
Projekt som anger <PublishTrimmed>true</PublishTrimmed>
, <IsTrimmable>true</IsTrimmable>
eller <EnableTrimAnalyzer>true</EnableTrimAnalyzer>
med en TargetFramework
version av .NET Standard eller .NET Framework, skapar en varning eller ett fel eftersom trimning inte stöds för dessa målramverk.
Tidigare beteende
Tidigare, när de användes i ett .NET Standard- eller .NET Framework-projekt, betedde sig de här inställningarna på följande sätt:
<PublishTrimmed>true</PublishTrimmed>
hade ingen effekt.<IsTrimmable>true</IsTrimmable>
inbäddade ett attribut[assembly: AssemblyMetadata("IsTrimmable", "true")]
på sammansättningsnivå i utdatasammansättningen. Det attributet valde sammansättningen till att trimma när den används i en trimmad app (även en app som använder<TrimMode>partial</TrimMode>
).<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
aktiverad trimningsanalys för biblioteket med hjälp av .NET Standard- eller .NET Framework-referenssammansättningar som motsvarar biblioteketsTargetFramework
även om dessa referenssammansättningar inte kommenteras för trimning.
Nytt beteende
Från och med .NET 8 SDK i ett projekt som riktar sig till .NET Standard eller .NET Framework:
<PublishTrimmed>
genererar ett fel som anger att den här inställningen inte stöds för målramverket.<IsTrimmable>
och<EnableTrimAnalyzer>
skapar en varning som anger att<IsTrimmable>
målramverket inte stöds. De här inställningarna påverkar annars inte byggutdata.
Version introducerad
.NET 8 RC 1
Typ av icke-bakåtkompatibel ändring
Den här ändringen är en beteendeförändring.
Orsak till ändringen
Att tillåta användning av <PublishTrimmed>
i ett .NET Standard- eller .NET Framework-projekt kan ha gett det falska intrycket att den här inställningen trimmade utdata, när det i själva verket inte hade någon effekt.
Att tillåta användning av <IsTrimmable>
eller <EnableTrimAnalyzer>
i ett .NET Standard- eller .NET Framework-projekt innebar att det var enkelt för biblioteksförfattare att välja att trimma, utan att bli aviserad om trimning av inkompatibiliteter. Eftersom referenssammansättningarna .NET Standard och .NET Framework inte kommenteras för trimning, fanns det inga varningar om användning av ramverks-API:er som inte är kompatibla med trimning.
Rekommenderad åtgärd
Undvik att ange <PublishTrimmed>
i projekt som är inriktade på .NET Standard eller .NET Framework. Undvik också att ange <PublishAot>
vilket innebär den tidigare inställningen.
Undvik att ange <IsTrimmable>
eller <EnableTrimAnalyzer>
i bibliotek som är avsedda för .NET Standard eller .NET Framework. Undvik också att ange <IsAotCompatible>
, vilket innebär de tidigare inställningarna. I stället ska biblioteket ha flera mål för att inkludera den senaste TargetFramework
och aktivera <IsTrimmable>
endast för målramverk som stöds. Inställningen <IsTrimmable>
kör den senaste versionen av trimanalysatorn med trimkompatibilitetsanteckningar från den senaste versionen av ramverket.
De här inställningarna omfattar till net8.0
exempel flera mål och anger <IsTrimmable>
endast för det här målramverket. Den här logiken används IsTargetFrameworkCompatible
så att den gäller för alla ramverk som är kompatibla med net6.0
, när trimning först stöds officiellt. På så sätt behöver villkoret inte uppdateras när du lägger till nya målramverk.
<PropertyGroup>
<TargetFrameworks>netstandard2.1;net8.0</TargetFrameworks>
<IsTrimmable Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net6.0'))">true</IsTrimmable>
</PropertyGroup>