CA1408: Nie używać AutoDual ClassInterfaceType
TypeName |
DoNotUseAutoDualClassInterfaceType |
CheckId |
CA1408 |
Kategoria |
Microsoft.Interoperability |
Zmiana kluczowa |
Kluczowa |
Przyczyna
Widoczny typ modelu Component Object Model (COM) jest oznaczony ClassInterfaceAttribute atrybutem ustawionym na AutoDual wartość ClassInterfaceType.
Opis reguły
Typy, które korzystają z podwójnych interfejsów, umożliwiają klientom powiązanie z określonym interfejsem.Wszelkie zmiany w przyszłej wersji układ typu lub wszelkich typów podstawowych spowoduje przerwanie klientów COM powiązanych z interfejsem.Domyślnie jeśli atrybut ClassInterfaceAttribute nie jest określony, używany jest interfejs służący tylko do wysłania.
Chyba że oznaczono inaczej, wszystkie publiczne typy niegeneryczne są widoczne w modelu COM; wszystkie typy niepublicznych i generyczne są niewidoczne dla modelu COM.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, zmień wartość atrybutu ClassInterfaceAttribute na None wartości ClassInterfaceType i jawnie zdefiniuj interfejsu.
Kiedy pominąć ostrzeżenia
Nie pomijaj ostrzeżenie od tej reguły, chyba że jest pewne, że ten układ typu i jego typów podstawowych nie ulegnie zmianie w przyszłej wersji.
Przykład
Poniższy przykład pokazuje klasę, która narusza regułę i ponowną deklarację klasy używającą jawnego interfejsu.
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() {}
}
}
Powiązane reguły
CA1403: Typy automatycznego układu nie powinny być widoczne dla modelu COM
CA1412: Oznacz interfejsy ComSource jako IDispatch
Zobacz też
Koncepcje
Kwalifikowanie typów .NET do międzyoperacyjności