IL3003: заметки "RequiresAssemblyFilesAttribute" должны соответствовать всем реализациям интерфейса или переопределениям

Значение
Идентификатор правила IL3003
Категория SingleFile
Исправление является критическим или неразрывным Некритическое

Причина

При публикации приложения в виде одного файла (например, путем задания PublishSingleFile свойства true в проекте), реализации интерфейса или производные классы с элементами, не имеющими соответствующие заметки [RequiresAssemblyFiles] , могут привести к вызову члена с атрибутом, который не совместим с одним файлом. Существует четыре возможных сценария, где можно создать предупреждение:

  • Элемент базового класса имеет атрибут, но переопределяющий член производного класса не имеет атрибута:

    public class Base
    {
        [RequiresAssemblyFiles]
        public virtual void TestMethod() {}
    }
    public class Derived : Base
    {
        // IL3003: Base member 'Base.TestMethod' with 'RequiresAssemblyFilesAttribute' has a derived member 'Derived.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
        public override void TestMethod() {}
    }
    
  • Элемент базового класса не имеет атрибута, но переопределяющий член производного класса имеет атрибут:

    public class Base
    {
        public virtual void TestMethod() {}
    }
    public class Derived : Base
    {
        // IL3003: Member 'Derived.TestMethod()' with 'RequiresAssemblyFilesAttribute' overrides base member 'Base.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
        [RequiresAssemblyFiles]
        public override void TestMethod() {}
    }
    
  • Элемент интерфейса имеет атрибут, но его реализация не имеет атрибута:

    interface IRAF
    {
        [RequiresAssemblyFiles]
        void TestMethod();
    }
    class Implementation : IRAF
    {
        // IL3003: Interface member 'IRAF.TestMethod()' with 'RequiresAssemblyFilesAttribute' has an implementation member 'Implementation.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
        public void TestMethod () { }
    }
    
  • Элемент интерфейса не имеет атрибута, но его реализация имеет атрибут:

    interface INoRAF
    {
        void TestMethod();
    }
    class Implementation : INoRAF
    {
        [RequiresAssemblyFiles]
        // IL3003: Member 'Implementation.TestMethod()' with 'RequiresAssemblyFilesAttribute' implements interface member 'INoRAF.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute.
        public void TestMethod () { }
    }
    

Устранение нарушений

Во всех интерфейсах и переопределениях наличие или отсутствие атрибута "RequiresAssemblyFilesAttribute" должно сохраняться как в реализации, так и в определении. Либо оба элемента должны содержать атрибут, либо ни один. Удалите или добавьте атрибут в интерфейс или элемент базового класса или в реализацию или элемент производного класса, чтобы атрибут содержался либо в обоих элементах, либо ни в одном.

Когда лучше отключить предупреждения

Не следует отключать это предупреждение.