Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Aktualisiert: November 2007
TypeName |
DoNotUseAutoDualClassInterfaceType |
CheckId |
CA1408 |
Kategorie |
Microsoft.Interoperability |
Unterbrechende Änderung |
Breaking |
Ursache
Ein für COM sichtbarer Typ wird mit dem auf ClassInterfaceType.AutoDual festgelegten System.Runtime.InteropServices.ClassInterfaceAttribute-Attribut markiert.
Regelbeschreibung
Typen, die eine duale Schnittstelle verwenden, ermöglichen Clients das Binden 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.
Behandlung von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ändern Sie den Wert des ClassInterfaceAttribute-Attributs in None, 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
Typen mit automatischem Layout sollten nicht COM sichtbar sein
ComSource-Schnittstellen als IDispatch markieren
Siehe auch
Konzepte
Einführung in die Klassenschnittstelle
Qualifizieren von .NET-Typen für die Interoperation