Поделиться через


Обрезка не может использоваться с .NET Standard или платформа .NET Framework

Проекты, которые задают <PublishTrimmed>true</PublishTrimmed><IsTrimmable>true</IsTrimmable> или <EnableTrimAnalyzer>true</EnableTrimAnalyzer> с TargetFramework любой версией .NET Standard или платформа .NET Framework создают предупреждение или ошибку, так как обрезка не поддерживается для этих целевых платформ.

Прежнее поведение

Ранее при использовании в проекте .NET Standard или платформа .NET Framework эти параметры ведут себя следующим образом:

  • <PublishTrimmed>true</PublishTrimmed> не повлияло.
  • <IsTrimmable>true</IsTrimmable> внедрен атрибут [assembly: AssemblyMetadata("IsTrimmable", "true")] уровня сборки в выходную сборку. Этот атрибут выбрал сборку в обрезку при использовании в обрезке приложения (даже используемое приложение <TrimMode>partial</TrimMode>).
  • <EnableTrimAnalyzer>true</EnableTrimAnalyzer>включен анализ обрезки библиотеки с помощью .NET Standard или платформа .NET Framework ссылочных сборок, соответствующих сборкам библиотекиTargetFramework, даже если эти эталонные сборки не помечены для обрезки.

Новое поведение

Начиная с пакета SDK для .NET 8 в проекте, предназначенном для .NET Standard или платформа .NET Framework:

  • <PublishTrimmed> создает ошибку, указывающую, что этот параметр не поддерживается для целевой платформы.
  • <IsTrimmable> и <EnableTrimAnalyzer> создай предупреждение, указывающее, что <IsTrimmable> не поддерживается для целевой платформы. Эти параметры в противном случае не влияют на выходные данные сборки.

Представленные версии

.NET 8 RC 1

Тип критического изменения

Это изменение поведения.

Причина изменения

Разрешение использования <PublishTrimmed> в проекте .NET Standard или платформа .NET Framework, возможно, дало ложное впечатление, что этот параметр обрезал выходные данные, когда на самом деле он не повлиял.

Разрешение использования или <IsTrimmable> в <EnableTrimAnalyzer> проекте .NET Standard или платформа .NET Framework означает, что авторам библиотеки было легко отказаться от обрезки без предупреждения о несовместимости. Так как эталонные сборки .NET Standard и платформа .NET Framework не помечены для обрезки, не было предупреждений об использовании API платформы, несовместимых с обрезкой.

Избегайте настройки <PublishTrimmed> в проектах, предназначенных для .NET Standard или платформа .NET Framework. Кроме того, избегайте настройки <PublishAot> , которые подразумевают бывший параметр.

Избегайте настройки <IsTrimmable> или <EnableTrimAnalyzer> в библиотеках, предназначенных для .NET Standard или платформа .NET Framework. Кроме того, не используйте параметр <IsAotCompatible>, который подразумевает предыдущие параметры. Вместо этого мультицельная библиотека включает последнюю TargetFrameworkверсию и включает <IsTrimmable> только поддерживаемые целевые платформы. Параметр <IsTrimmable> запустит последнюю версию анализатора обрезки с помощью заметок совместимости с обрезкой из последней версии платформы.

Например, эти параметры для включения net8.0нескольких целевых параметров и задаются <IsTrimmable> только для этой целевой платформы. Эта логика используется IsTargetFrameworkCompatible таким образом, чтобы она применялась к любым платформам, совместимым с net6.0, когда обрезка была впервые официально поддерживаема. Таким образом, при добавлении новых целевых платформ условие не требуется обновлять.

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

См. также