Partage via


IL3003 : les annotations « RequiresAssemblyFilesAttribute » doivent correspondre à toutes les implémentations ou substitutions d’interface

Value
Identificateur de la règle IL3003
Catégorie SingleFile
Le correctif est cassant ou non cassant Non cassant

Cause

Lorsque vous publiez une application en tant que fichier unique (par exemple, en définissant la propriété PublishSingleFile d’un projet sur true), les implémentations d’interface ou les classes dérivées avec des membres qui n’ont pas d’annotations correspondantes de [RequiresAssemblyFiles] peuvent finir par appeler un membre avec l’attribut qui n’est pas compatible avec un seul fichier. Il existe quatre scénarios possibles dans lesquels l’avertissement peut être généré :

  • Un membre d’une classe de base a l’attribut, mais le membre de substitution de la classe dérivée n’a pas l’attribut :

    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() {}
    }
    
  • Un membre d’une classe de base n’a pas l’attribut, mais le membre de substitution de la classe dérivée a l’attribut :

    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() {}
    }
    
  • Un membre d’interface a l’attribut, mais son implémentation n’a pas l’attribut :

    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 () { }
    }
    
  • Un membre d’interface n’a pas l’attribut, mais son implémentation a l’attribut :

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

Comment corriger les violations

Pour tous les interfaces et tous les remplacements, l’implémentation doit correspondre à la définition en termes de présence ou d’absence de l’attribut « RequiresAssemblyFilesAttribute ». Les deux membres contiennent l’attribut ou aucun ne l’a. Supprimez ou ajoutez l’attribut sur le membre d’interface / de classe de base ou le membre de classe d’implémentation/dérivation afin que l’attribut se trouve sur les deux ou aucun des deux.

Quand supprimer les avertissements

Vous ne devez pas supprimer cet avertissement.