IL2026: члены, аннотированные атрибутом RequiresUnreferencedCode, могут вызвать проблемы при обрезке

Причина

Вызов (или доступ через отражение) к члену, аннотированному с помощью RequiresUnreferencedCodeAttribute.

Рассмотрим пример.

[RequiresUnreferencedCode("Use 'MethodFriendlyToTrimming' instead", Url="http://help/unreferencedcode")]
void MethodWithUnreferencedCodeUsage()
{
}

void TestMethod()
{
    // IL2026: Using method 'MethodWithUnreferencedCodeUsage' which has 'RequiresUnreferencedCodeAttribute'
    // can break functionality when trimming application code. Use 'MethodFriendlyToTrimming' instead. http://help/unreferencedcode
    MethodWithUnreferencedCodeUsage();
}

Описание правила

RequiresUnreferencedCodeAttribute указывает, что ссылки члена содержат код, который может быть удален триммером.

Распространенные примеры:

  • Load(String) помечен как RequiresUnreferencedCode, поскольку загружаемая сборка может обращаться к членам, которые были удалены. Триммер удаляет всех членов из фреймворка, кроме тех, которые непосредственно используются приложением, поэтому, скорее всего, загрузка новых сборок в процессе выполнения программы попытается получить доступ к отсутствующим членам.

  • XmlSerializer помечается как RequiresUnreferencedCode из-за того, что XmlSerializer использует сложное отражение для сканирования типов входных данных. Отражение не может отслеживаться триммером, поэтому элементы, транзитивно используемые типами ввода, могут быть удалены.