Freigeben über


Das Kürzen darf nicht mit .NET Standard oder .NET Framework verwendet werden.

Projekte, die <PublishTrimmed>true</PublishTrimmed>, <IsTrimmable>true</IsTrimmable> oder <EnableTrimAnalyzer>true</EnableTrimAnalyzer> mit einem Zielframework (TargetFramework) festlegen, das eine beliebige Version von .NET Standard oder .NET Framework hat, erzeugen eine Warnung oder einen Fehler, da die Kürzung für diese Zielframeworks nicht unterstützt wird.

Vorheriges Verhalten

Bei Verwendung in einem .NET Standard- oder .NET Framework-Projekt verhielten sich diese Einstellungen wie folgt:

  • <PublishTrimmed>true</PublishTrimmed> hat keine Auswirkungen.
  • <IsTrimmable>true</IsTrimmable> hat ein Attribut auf Assemblyebene ([assembly: AssemblyMetadata("IsTrimmable", "true")]) in die Ausgabeassembly eingebettet. Dieses Attribut hat für die Assembly bei Verwendung in einer gekürzten App (auch einer App, die <TrimMode>partial</TrimMode> verwendet) die Kürzung aktiviert.
  • <EnableTrimAnalyzer>true</EnableTrimAnalyzer> hat die Trimmanalyse für die Bibliothek aktiviert, wobei die .NET Standard- oder .NET Framework-Referenzassemblys verwendet werden, die dem Zielframework (TargetFramework) der Bibliothek entsprechen, obwohl diese Referenzassemblys keine Anmerkungen zum Kürzen enthalten.

Neues Verhalten

Ab dem .NET 8 SDK in einem Projekt für .NET Standard oder .NET Framework:

  • <PublishTrimmed> erzeugt einen Fehler, der angibt, dass diese Einstellung für das Zielframework nicht unterstützt wird.
  • <IsTrimmable> oder <EnableTrimAnalyzer> erzeugen eine Warnung mit dem Hinweis, dass <IsTrimmable> für das Zielframework nicht unterstützt wird. Diese Einstellungen haben ansonsten keine Auswirkung auf die Buildausgabe.

Eingeführt in Version

.NET 8 RC 1

Typ des Breaking Changes

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Das Zulassen der Verwendung von <PublishTrimmed> in einem .NET Standard- oder .NET Framework-Projekt hat möglicherweise den falschen Eindruck geweckt, dass diese Einstellung die Ausgabe gekürzt hat, wenn sie tatsächlich keine Auswirkung hatte.

Das Zulassen der Verwendung von <IsTrimmable> oder <EnableTrimAnalyzer> in einem .NET Standard- oder .NET Framework-Projekt bedeutete, dass es für Bibliotheksersteller*innen einfach war, sich für die Kürzung zu entscheiden, ohne über Kürzungsinkompatibilitäten benachrichtigt zu werden. Da die .NET Standard- und .NET Framework-Referenzassemblys nicht zum Kürzen kommentiert werden, gab es keine Warnungen zur Verwendung von Framework-APIs, die nicht mit dem Kürzen kompatibel sind.

Vermeiden Sie das Festlegen von <PublishTrimmed> in Projekten, die auf .NET Standard oder .NET Framework abzielen. Vermeiden Sie auch das Festlegen von<PublishAot>. Dadurch wird die frühere Einstellung impliziert.

Vermeiden Sie das Festlegen von <IsTrimmable> oder <EnableTrimAnalyzer> in Bibliotheken, die auf .NET Standard oder .NET Framework abzielen. Vermeiden Sie auch das Festlegen von<IsAotCompatible>. Dadurch werden die früheren Einstellungen impliziert. Stattdessen können Sie mehrere Ziele für die Bibliothek festlegen, um das aktuelle Zielframework (TargetFramework) einzuschließen, und aktivieren Sie <IsTrimmable> nur für die unterstützten Zielframeworks. Wenn Sie <IsTrimmable> festlegen, wird die neueste Version des Kürzungsanalysetools mithilfe von Anmerkungen zur Kürzungskompatibilität aus der neuesten Version des Frameworks ausgeführt.

Diese Einstellungen legen beispielsweise mehrere Ziele fest, um net8.0 einzuschließend, und legen <IsTrimmable> nur für dieses Zielframework fest. Diese Logik verwendet IsTargetFrameworkCompatible, sodass sie auf alle mit net6.0 kompatiblen Frameworks angewendet wird. Ab dieser Version wurde die Kürzung offiziell unterstützt. Auf diese Weise muss die Bedingung beim Hinzufügen neuer Zielframeworks nicht aktualisiert werden.

<PropertyGroup>
  <TargetFrameworks>netstandard2.1;net8.0</TargetFrameworks>
  <IsTrimmable Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net6.0'))">true</IsTrimmable>
</PropertyGroup>

Siehe auch