Compartilhar via


IL3003: as anotações "RequiresAssemblyFilesAttribute" devem corresponder a todas as implementações ou substituições de interface

Valor
ID da regra IL3003
Categoria SingleFile
A correção é interruptiva ou não interruptiva Não interruptiva

Causa

Quando você publica um aplicativo como um único arquivo (por exemplo, definindo a propriedade PublishSingleFile como true em um projeto), implementações de interface ou classes derivadas com membros que não têm anotações correspondentes de [RequiresAssemblyFiles] podem levar à chamada de um membro com o atributo, o que não é compatível com um único arquivo. Há quatro cenários possíveis em que o aviso pode ser gerado:

  • Um membro de uma classe base tem o atributo, mas o membro principal da classe derivada não tem o atributo:

    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() {}
    }
    
  • Um membro de uma classe base não tem o atributo, mas o membro principal da classe derivada tem o atributo:

    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() {}
    }
    
  • Um membro de interface tem o atributo, mas sua implementação não tem o atributo:

    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 () { }
    }
    
  • Um membro de interface não tem o atributo, mas sua implementação tem o atributo:

    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 () { }
    }
    

Como corrigir violações

Para todas as interfaces e substituições, a implementação precisa corresponder à definição em termos de presença ou ausência do atributo 'RequiresAssemblyFilesAttribute'. Ambos os membros devem contêm o atributo ou nenhum deles. Remova ou adicione o atributo no membro da classe base/de interface ou implementando/derivando o membro da classe para que o atributo esteja em ambos ou em nenhum deles.

Quando suprimir avisos

Você não deve suprimir este aviso.