Известные несовместимости тримминга

В этой статье перечислены шаблоны, несовместимые с урезкой с современным инструментом.

Сериализаторы на основе рефлексии

Альтернатива: сериализаторы без использования рефлексии.

Многие виды использования рефлексии можно сделать совместимыми с обрезкой, как описано в Введение в предупреждения об обрезке. Однако сериализаторы, как правило, имеют сложные случаи применения рефлексии. Многие из этих применений не могут быть сделаны анализируемыми во время сборки. К сожалению, наиболее подходящим вариантом часто является перезапись системы для использования исходного поколения.

В следующей таблице перечислены популярные сериализаторы на основе отражения и их рекомендуемые альтернативные варианты.

Сериализаторы Альтернатива
Newtonsoft.Json Источник создан System.Text.Json
System.Configuration.ConfigurationManager Генератор исходного кода для привязки конфигурации
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter Отказаться от использования сериализации BinaryFormatter из-за ее недостатков в безопасности и надежности.

Создание кода среды выполнения с помощью JIT

Создание кода среды выполнения через JIT,например, через System.Reflection.Emit несовместимо с обрезкой.

Динамическая загрузка и выполнение сборки

Обрезка и динамическая загрузка сборок — это распространенная проблема для систем, поддерживающих подключаемые модули или расширения, обычно через API, например LoadFrom(String). Обрезка зависит от учета всех сборок во время сборки, чтобы определить, какой код используется и какой код не может быть удален как неиспользуемый. Большинство плагин-систем загружают сторонний код динамически, поэтому триммер не может определить, какой код необходим.

Несовместимость платформы Windows

В следующих разделах перечислены известные несовместимости с обрезкой в Windows.

Программирование NET с помощью C++/CLI

Программирование .NET с помощью C++/CLI в настоящее время не поддерживает функцию удаления лишних элементов.

Встроенная маршализация COM

Альтернатива: COM-обертки

Автоматический маршаллинг COM был встроен в .NET с .NET Framework 1.0. Он использует анализ кода среды выполнения для автоматического преобразования между собственными COM-объектами и управляемыми объектами .NET. К сожалению, анализ тримминга не всегда может определить, какой .NET код следует сохранить для автоматического COM маршаллинга. Однако, если вместо этого используются COM-обертки, анализ тримминга может гарантировать, что весь используемый код будет правильно сохранен.

WPF (Windows Presentation Foundation)

Платформа Windows Presentation Foundation (WPF) значительно использует отражение, и некоторые функции сильно зависят от проверки кода среды выполнения. Невозможно обрезать анализ, чтобы сохранить весь необходимый код для приложений WPF. К сожалению, почти никаких приложений WPF не выполняются после обрезки, поэтому поддержка обрезки WPF в настоящее время отключена в пакете SDK для .NET. Смотрите проблему "WPF не совместим с обрезкой" для получения информации о прогрессе в обеспечении совместимости обрезки для WPF.

Windows Forms

Платформа Windows Forms обеспечивает минимальное использование отражения, но в значительной степени зависит от встроенного маршаллинга COM. К сожалению, почти все приложения Windows Forms невозможно запустить без встроенного маршаллинга COM, поэтому поддержка обрезки для приложений Windows Forms в настоящее время отключена в пакете SDK для .NET. Смотрите статью о проблеме сделать WinForms совместимым с обрезкой для отслеживания прогресса в включении этой функции для Windows Forms.