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