Udostępnij za pośrednictwem


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 bibliotece TargetFramework , 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.

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ą TargetFrameworkwersję 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.0w 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.0programem , 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>

Zobacz też