Przycinanie może nie być używane w programie .NET Standard lub .NET Framework
Projekty, które ustawiają <PublishTrimmed>true</PublishTrimmed>
element lub TargetFramework
<IsTrimmable>true</IsTrimmable>
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
z dowolną wersją platformy .NET Standard lub .NET Framework, generują ostrzeżenie lub błąd, ponieważ przycinanie nie jest obsługiwane dla tych platform docelowych.
Poprzednie zachowanie
Wcześniej w przypadku użycia w projekcie .NET Standard lub .NET Framework te ustawienia zachowywały się w następujący sposób:
<PublishTrimmed>true</PublishTrimmed>
nie miał żadnego efektu.<IsTrimmable>true</IsTrimmable>
osadzone atrybutu[assembly: AssemblyMetadata("IsTrimmable", "true")]
na poziomie zestawu do zestawu wyjściowego. Ten atrybut zdecydował się na przycinanie zestawu w przypadku użycia w przyciętej aplikacji (nawet aplikacji, która używa<TrimMode>partial</TrimMode>
elementu ).<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
włączona analiza przycinania biblioteki przy użyciu zestawów odwołań .NET Standard lub .NET Framework odpowiadających biblioteceTargetFramework
, mimo że te zestawy odwołań nie są oznaczone do przycinania.
Nowe zachowanie
Począwszy od zestawu .NET 8 SDK, w projekcie przeznaczonym dla platformy .NET Standard lub .NET Framework:
<PublishTrimmed>
Generuje błąd wskazujący, że to ustawienie jest nieobsługiwane dla platformy docelowej.<IsTrimmable>
i<EnableTrimAnalyzer>
generuje ostrzeżenie wskazujące, że<IsTrimmable>
nie jest obsługiwane dla platformy docelowej. Te ustawienia w przeciwnym razie nie mają wpływu na dane wyjściowe kompilacji.
Wprowadzona wersja
.NET 8 RC 1
Typ zmiany powodującej niezgodność
Ta zmiana jest zmianą behawioralną.
Przyczyna wprowadzenia zmiany
Zezwolenie na użycie elementu <PublishTrimmed>
w projekcie .NET Standard lub .NET Framework mogło mieć fałszywe wrażenie, że to ustawienie przycina dane wyjściowe, gdy w rzeczywistości nie miało żadnego wpływu.
Zezwolenie na korzystanie z <IsTrimmable>
programu lub <EnableTrimAnalyzer>
w projekcie .NET Standard lub .NET Framework oznaczało, że autorom biblioteki łatwo było wyrazić zgodę na przycinanie, bez powiadamiania o niezgodności przycinania. Ponieważ zestawy referencyjne .NET Standard i .NET Framework nie są adnotacjami do przycinania, nie było żadnych ostrzeżeń dotyczących użycia interfejsów API platformy niezgodnych z przycinaniem.
Zalecana akcja
Unikaj ustawiania <PublishTrimmed>
w projektach przeznaczonych dla platformy .NET Standard lub .NET Framework. Należy również unikać ustawiania <PublishAot>
, co oznacza poprzednie ustawienie.
Unikaj ustawiania <IsTrimmable>
lub <EnableTrimAnalyzer>
w bibliotekach przeznaczonych dla platformy .NET Standard lub .NET Framework. Należy również unikać ustawienia <IsAotCompatible>
, co oznacza poprzednie ustawienia. Zamiast tego biblioteka ma zawierać najnowszą TargetFramework
wersję i włączyć <IsTrimmable>
tylko dla obsługiwanych platform docelowych. Ustawienie <IsTrimmable>
spowoduje uruchomienie najnowszej wersji analizatora przycinania przy użyciu adnotacji zgodności przycinania z najnowszej wersji platformy.
Na przykład te ustawienia mają być uwzględniane net8.0
w wielu elementach docelowych i ustawiane <IsTrimmable>
tylko dla tej platformy docelowej. Ta logika jest używana IsTargetFrameworkCompatible
tak, aby była stosowana do wszystkich struktur zgodnych z net6.0
programem , gdy przycinanie zostało po raz pierwszy oficjalnie obsługiwane. W ten sposób warunek nie musi być aktualizowany podczas dodawania nowych struktur docelowych.
<PropertyGroup>
<TargetFrameworks>netstandard2.1;net8.0</TargetFrameworks>
<IsTrimmable Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net6.0'))">true</IsTrimmable>
</PropertyGroup>