Freigeben über


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

TypeName

ComVisibleTypeBaseTypesShouldBeComVisible

CheckId

CA1405

Kategorie

Microsoft.Interoperability

Unterbrechende Änderung

DependsOnFix

Ursache

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

Regelbeschreibung

Wenn ein für COM sichtbarer Typ Member in einer neuen Version hinzufügt, muss er sich an strenge Richtlinien halten, damit COM-Clients, die an die aktuelle Version gebunden sind, die Verbindung nicht abbrechen. Bei einem Typ, der für COM nicht sichtbar ist, wird davon ausgegangen, dass er diese COM-Versionsregeln nicht einhalten muss, wenn er neue Member hinzufügt. Wenn jedoch ein für COM sichtbarer Typ von dem für COM nicht sichtbaren Typ abgeleitet wird und eine Klassenschnittstelle von ClassInterfaceType.AutoDual oder AutoDispatch (Standard) verfügbar macht, werden alle öffentlichen Member des Basistyps für COM verfügbar gemacht, sofern sie nicht als für COM nicht sichtbar markiert sind. Dies wäre allerdings redundant. Wenn der Basistyp in einer späteren Version neue Member hinzufügt, unterbrechen möglicherweise sämtliche COM-Clients, die an die Klassenschnittstelle des abgeleiteten Typs gebunden sind, die Verbindung. Für COM sichtbare Typen sollten nur von für COM sichtbaren Typen abgeleitet werden, um die Wahrscheinlichkeit einer Verbindungsunterbrechung zu reduzieren.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, machen Sie die Basistypen für COM sichtbar oder den abgeleiteten Typ für COM unsichtbar.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel

Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen die Regel verstößt.

Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary

   <ComVisibleAttribute(False)> _ 
   Public Class BaseClass

      Sub SomeSub(valueOne As Integer)
      End Sub

   End Class

   ' This class violates the rule.
   <ComVisibleAttribute(True)> _ 
   Public Class DerivedClass
      Inherits BaseClass

      Sub AnotherSub(valueOne As Integer, valueTwo As Integer)
      End Sub

   End Class

End Namespace
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

Referenz

System.Runtime.InteropServices.ClassInterfaceAttribute

Konzepte

Einführung in die Klassenschnittstelle

Weitere Ressourcen

Interoperation mit nicht verwaltetem Code