CA1408: AutoDual ClassInterfaceType nicht verwenden
TypeName |
DoNotUseAutoDualClassInterfaceType |
CheckId |
CA1408 |
Kategorie |
Microsoft.Interoperability |
Unterbrechende Änderung |
Breaking |
Ursache
Ein sichtbarer Component Object Model (COM)-Typ wird mit dem auf den AutoDual-Wert von ClassInterfaceType festgelegten ClassInterfaceAttribute-Attribut markiert.
Regelbeschreibung
Typen, die eine duale Schnittstelle verwenden, ermöglichen Clients die Bindung an ein bestimmtes Schnittstellenlayout. Änderungen an einer zukünftigen Version des Layouts des Typs oder eines Basistyps führen zur Aufhebung der Verbindung zu COM-Clients, die eine Bindung zu der Schnittstelle haben. Standardmäßig wird eine auf Dispatch beschränkte Schnittstelle verwendet, wenn das ClassInterfaceAttribute-Attribut nicht angegeben wird.
Sofern nicht anders markiert, sind alle öffentlichen, nicht generischen Typen für COM sichtbar; alle nicht öffentlichen, generischen Typen sind für COM nicht sichtbar.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ändern Sie den Wert des ClassInterfaceAttribute-Attributs in den None-Wert von ClassInterfaceType, und definieren Sie die Schnittstelle explizit.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel, es sei denn, es steht fest, dass das Layout des Typs und der zugehörigen Basistypen in einer zukünftigen Version nicht geändert werden.
Beispiel
Im folgenden Beispiel wird eine Klasse veranschaulicht, die gegen die Regel verstößt. Diese Klasse wird neu deklariert, sodass eine explizite Schnittstelle verwendet wird.
Imports System
Imports System.Runtime.InteropServices
<Assembly: ComVisibleAttribute(True)>
Namespace InteroperabilityLibrary
' This violates the rule.
<ClassInterfaceAttribute(ClassInterfaceType.AutoDual)> _
Public Class DualInterface
Public Sub SomeSub
End Sub
End Class
Public Interface IExplicitInterface
Sub SomeSub
End Interface
<ClassInterfaceAttribute(ClassInterfaceType.None)> _
Public Class ExplicitInterface
Implements IExplicitInterface
Public Sub SomeSub Implements IExplicitInterface.SomeSub
End Sub
End Class
End Namespace
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(true)]
namespace InteroperabilityLibrary
{
// This violates the rule.
[ClassInterface(ClassInterfaceType.AutoDual)]
public class DualInterface
{
public void SomeMethod() {}
}
public interface IExplicitInterface
{
void SomeMethod();
}
[ClassInterface(ClassInterfaceType.None)]
public class ExplicitInterface : IExplicitInterface
{
public void SomeMethod() {}
}
}
Verwandte Regeln
CA1403: Typen mit automatischem Layout sollten nicht für COM sichtbar sein
CA1412: ComSource-Schnittstellen als IDispatch markieren
Siehe auch
Konzepte
Einführung in die Klassenschnittstelle
Qualifizieren von .NET-Typen für die Interoperation