Freigeben über


CA1405: Für COM sichtbare Basistypen sollten für COM sichtbar sein.

Element Wert
RuleId CA1405
Category Microsoft.Interoperability
Unterbrechende Änderung DependsOnFix

Ursache

Ein sichtbarer COM-Typ (Component Object Model) wird von einem Typ abgeleitet, der nicht für COM sichtbar ist.

Regelbeschreibung

Wenn ein sichtbarer COM-Typ in einer neuen Version Member hinzufügt, muss er sich an strenge Richtlinien halten, damit COM-Clients, die an die aktuelle Version gebunden sind, nicht beeinträchtigt werden. Ein Typ, der für COM nicht sichtbar ist, setzt voraus, dass er diese COM-Versionierungsregeln nicht befolgen muss, wenn er neue Member hinzufügt. Wenn jedoch ein sichtbarer COM-Typ vom nicht sichtbaren COM-Typ abgeleitet wird und eine Klassenschnittstelle von System.Runtime.InteropServices.ClassInterfaceType oder ClassInterfaceType (Standard) aufweist, werden alle öffentlichen Member des Basistyps (es sei denn, sie sind ausdrücklich als nicht für COM sichtbar gekennzeichnet, was überflüssig wäre) für COM sichtbar. Wenn der Basistyp in einer späteren Version neue Member hinzufügt, können alle COM-Clients, die an die Klassenschnittstelle des abgeleiteten Typs gebunden sind, nicht mehr funktionieren. Für COM sichtbare Typen sollten nur von für COM sichtbaren Typen abgeleitet werden, um die Wahrscheinlichkeit zu verringern, dass COM-Clients beschädigt werden.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, machen Sie die COM-Basistypen sichtbar oder den abgeleiteten COM-Typ nicht sichtbar.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel

Das folgende Beispiel zeigt einen Typ, der gegen die Regel verstößt.

using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
   [ComVisible(false)]
   public class BaseClass
   {
      public void SomeMethod(int valueOne) {}
   }

   // This class violates the rule.
   [ComVisible(true)]
   public class DerivedClass : BaseClass
   {
      public void AnotherMethod(int valueOne, int valueTwo) {}
   }
}

Siehe auch