Freigeben über


CA1407: Statische Member in für COM sichtbaren Typen vermeiden

TypeName

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

Kategorie

Microsoft.Interoperability

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein Typ, der ausdrücklich als für Component Object Model (COM) sichtbar markiert ist, enthält eine public static Methode.

Regelbeschreibung

COM unterstützt keine static-Methoden.

Bei der Überprüfung dieser Regel werden Eigenschaften- und Ereignisaccessoren, Methoden für Operatorüberladungen oder mit dem System.Runtime.InteropServices.ComRegisterFunctionAttribute-Attribut oder dem System.Runtime.InteropServices.ComUnregisterFunctionAttribute-Attribut markierte Methoden ignoriert.

Standardmäßig sind folgende Programmierelemente für COM sichtbar: Assemblys, öffentliche Typen, öffentliche Instanzmember in öffentlichen Typen und alle Member öffentlicher Werttypen.

Damit diese Regel eintritt, müssen ein ComVisibleAttribute auf Assemblyebene auf false und das ComVisibleAttribute auf Klassenebene auf true festgelegt werden. Siehe dazu folgendes Codebeispiel:

using System;
using System.Runtime.InteropServices; 

[assembly: ComVisible(false)] 
namespace Samples
{    
    [ComVisible(true)]
    public class MyClass
    {
        public static void DoSomething()
        {
        }
    }
}

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, ändern Sie das Design dahingehend, dass eine Instanzenmethode verwendet wird, die die gleiche Funktionalität wie die static-Methode bereitstellt.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn ein COM-Client nicht auf die von der static-Methode bereitgestellte Funktionalität zugreifen muss.

Beispiel für einen Verstoß

Beschreibungen

Im folgenden Beispiel wird eine static-Methode veranschaulicht, die gegen diese Regel verstößt.

Code

using System;
using System.Runtime.InteropServices;
using System.Collections.ObjectModel; 

[assembly: ComVisible(false)] 

namespace Samples
{    
    [ComVisible(true)]    
    public class Book    
    {        
        private Collection<string> _Pages = new Collection<string>();         

        public Book()        
        {        
        }         

        public Collection<string> Pages        
        {            
            get { return _Pages; }        
        }                

        // Violates this rule        
        public static Book FromPages(string[] pages)        
        {            
            if (pages == null)                
                throw new ArgumentNullException("pages");             

            Book book = new Book();             

            foreach (string page in pages)            
            {                
                book.Pages.Add(page);            
            }             return book;        
        }    
    }
}

Kommentar

Im folgenden Beispiel kann die Book.FromPages-Methode nicht aus COM aufgerufen werden.

Beispiel für die Behandlung

Beschreibungen

Um den Verstoß im vorigen Beispiel zu behandeln, könnten Sie die Methode in eine Instanzenmethode ändern, was in diesem Fall jedoch keinen Sinn ergibt. Eine bessere Lösung besteht darin, ComVisible(false) explizit auf die Methode anzuwenden, um anderen Entwicklern gegenüber zu verdeutlichen, dass die Methode nicht aus COM angezeigt werden kann.

Im folgenden Beispiel wird ComRegisterFunctionAttribute auf die Methode angewendet.

Code

using System;
using System.Runtime.InteropServices;
using System.Collections.ObjectModel;

[assembly: ComVisible(false)]

namespace Samples
{
    [ComVisible(true)]
    public class Book
    {
        private Collection<string> _Pages = new Collection<string>();

        public Book()
        {
        }

        public Collection<string> Pages
        {
            get { return _Pages; }
        }

        [ComVisible(false)]
        public static Book FromPages(string[] pages)
        {
            if (pages == null)
                throw new ArgumentNullException("pages");

            Book book = new Book();

            foreach (string page in pages)
            {
                book.Pages.Add(page);
            }

            return book;
        }
    }
}

Verwandte Regeln

CA1017: Assemblys mit ComVisibleAttribute markieren

CA1406: Int64-Argumente für Visual Basic 6-Clients vermeiden

CA1413: Nicht öffentliche Felder in für COM sichtbaren Werttypen vermeiden

Siehe auch

Weitere Ressourcen

Interoperation mit nicht verwaltetem Code