CA1408: Nepoužívejte AutoDual ClassInterfaceType
TypeName |
DoNotUseAutoDualClassInterfaceType |
CheckId |
CA1408 |
Kategorie |
Microsoft.interoperability |
Narušující změna |
Narušující |
Příčina
Viditelný typ modelu COM (Component Object Model) je označen atributem ClassInterfaceAttribute nastaveným na hodnotu AutoDual typu ClassInterfaceType.
Popis pravidla
Typy, které používají duální rozhraní umožňují klientům se navázat na určité rozložení rozhraní.Změny v budoucí verzi rozložení typu nebo jakéhokoli základního typu přeruší klienty modulu COM, kteří jsou navázáni na toto rozhraní.Pokud ve výchozím nastavení není zadán atribut ClassInterfaceAttribute, použije se pouze rozhraní určené pro odesílání.
Pokud není označeno jinak, jsou všechny veřejné neobecné typy pro model COM viditelné a všechny neveřejné a obecné typy pro model COM neviditelné.
Jak vyřešit porušení
Chcete-li opravit porušení tohoto pravidla, změňte hodnotu atributu ClassInterfaceAttribute na hodnotu None typu ClassInterfaceType a explicitně definujte rozhraní.
Kdy potlačit upozornění
Nepotlačujte upozornění od tohoto pravidla, pokud není jisté, že se rozložení typu a jeho základních typů nebude v budoucích verzích měnit.
Příklad
Následující příklad ukazuje třídu, která porušuje toto pravidlo a upravenou deklaraci třídy, která používá explicitní rozhraní.
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() {}
}
}
Související pravidla
CA1403: Typy automatického rozložení nesmí být viditelné COM
CA1412: ComSource značka rozhraní IDispatch
Viz také
Koncepty
Kvalifikační.Typy sítí pro součinnost