Statische Member in für COM sichtbaren Typen vermeiden

Aktualisiert: November 2007

     TypeName

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

Kategorie

Microsoft.Interoperability

Unterbrechende Änderung

NonBreaking

Ursache

Ein Typ, der ausdrücklich als für COM sichtbar markiert ist, enthält eine publicstatic-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 ausgelöst wird, müssen ein ComRegisterFunctionAttribute auf Assemblyebene auf false und das ComRegisterFunctionAttribute 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()
        {
        }
    }
}

Behandlung 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ß

Beschreibung

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;        
        }    
    }
}

Kommentare

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

Beispiel für die Behandlung

Beschreibung

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

Markieren von Assemblys mit dem ComVisible-Attribut

Vermeiden von Int64-Argumenten für Visual Basic 6-Clients

Vermeiden von nicht öffentlichen Feldern in ComVisible-Werttypen

Siehe auch

Weitere Ressourcen

Interaktion mit nicht verwaltetem Code