CA1408: Non utilizzare AutoDual ClassInterfaceType
TypeName |
DoNotUseAutoDualClassInterfaceType |
CheckId |
CA1408 |
Category |
Microsoft.Interoperability |
Breaking Change |
Breaking |
Causa
Un tipo visibile a COM (Component Object Model) è contrassegnato con l'attributo ClassInterfaceAttribute impostato sul valore AutoDual di ClassInterfaceType.
Descrizione della regola
I tipi che utilizzano un'interfaccia duale consentono l'associazione dei client a uno specifico layout di interfaccia. Eventuali modifiche apportate in una versione futura al layout del tipo o ai tipi base interromperanno l'associazione dei client COM all'interfaccia. Per impostazione predefinita, se l'attributo ClassInterfaceAttribute non è specificato, viene utilizzata un'interfaccia di solo invio.
A meno che non sia specificato diversamente, tutti i tipi pubblici non generici sono visibili a COM, mentre i tipi non pubblici e generici sono invisibili.
Come correggere le violazioni
Per correggere una violazione di questa regola, modificare il valore dell'attributo ClassInterfaceAttribute nel valore None di ClassInterfaceType e definire in modo esplicito l'interfaccia.
Esclusione di avvisi
Non escludere un avviso per questa regola a meno che non sia certo che il layout del tipo e i relativi tipi base non verranno modificati in una versione successiva.
Esempio
Nell'esempio riportato di seguito sono riportate una classe che viola le regole e una nuova dichiarazione della classe per l'utilizzo di un'interfaccia esplicita.
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() {}
}
}
Regole correlate
CA1403: I tipi layout automatici non devono essere visibili a COM
CA1412: Contrassegnare le interfacce ComSource come IDispatch
Vedere anche
Concetti
Introduzione all'interfaccia della classe
Qualificazione di tipi .NET per l'interoperabilità