Freigeben über


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

Element Wert
RuleId CA1407
Category Microsoft.Interoperability
Unterbrechende Änderung Nicht unterbrechend

Ursache

Ein Typ, der speziell als für das Component Object Model (COM) sichtbar gekennzeichnet ist, enthält eine als public``static markierte Methode.

Regelbeschreibung

COM unterstützt static keine Methoden.

Diese Regel ignoriert Zugriffsmethoden für Eigenschaften und Ereignisse, Überladungsmethoden für Operatoren oder Methoden, die entweder mit dem System.Runtime.InteropServices.ComRegisterFunctionAttribute-Attribut oder dem System.Runtime.InteropServices.ComUnregisterFunctionAttribute-Attribut gekennzeichnet sind.

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

Damit diese Regel eintritt, muss ein ComVisibleAttribute auf Assemblyebene auf false und die Klasse ComVisibleAttribute auf true festgelegt sein, wie im folgenden Code gezeigt.

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 den Entwurf so ab, dass eine Instanzmethode verwendet wird, die die gleiche Funktionalität bietet wie die Methode static.

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, eine Warnung von dieser Regel zu unterdrücken, wenn ein COM-Client keinen Zugriff auf die Funktionalität benötigt, die von der static Methode bereitgestellt wird.

Beispiel für einen Verstoß

BESCHREIBUNG

Das folgende Beispiel zeigt eine static-Methode, 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

In diesem Beispiel kann die Book.FromPages-Methode nicht von COM aufgerufen werden.

Beispiel für eine Korrektur

BESCHREIBUNG

Zum Beheben des Verstoßes im vorherigen Beispiel könnten Sie die Methode in eine Instanzmethode umwandeln, was in diesem Fall jedoch nicht sinnvoll ist. Eine bessere Lösung besteht darin, explizit auf die Methode anzuwenden ComVisible(false) , um anderen Entwicklern deutlich zu machen, dass die Methode nicht von COM gesehen werden kann.

Das folgende Beispiel wendet ComVisibleAttribute auf die Methode an.

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

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

Interoperabilität mit nicht verwaltetem Code