CA1408: Do not use AutoDual ClassInterfaceType


The new home for Visual Studio documentation is Visual Studio 2017 Documentation on

The latest version of this topic can be found at CA1408: Do not use AutoDual ClassInterfaceType.

|Breaking Change|Breaking|

A Component Object Model (COM) visible type is marked with the ClassInterfaceAttribute attribute set to the AutoDual value of ClassInterfaceType.

Types that use a dual interface enable clients to bind to a specific interface layout. Any changes in a future version to the layout of the type or any base types will break COM clients that bind to the interface. By default, if the ClassInterfaceAttribute attribute is not specified, a dispatch-only interface is used.

Unless marked otherwise, all public nongeneric types are visible to COM; all nonpublic and generic types are invisible to COM.

To fix a violation of this rule, change the value of the ClassInterfaceAttribute attribute to the None value of ClassInterfaceType and explicitly define the interface.

Do not suppress a warning from this rule unless it is certain that the layout of the type and its base types will not change in a future version.

The following example shows a class that violates the rule and a re-declaration of the class to use an explicit interface.

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

CA1403: Auto layout types should not be COM visible

CA1412: Mark ComSource Interfaces as IDispatch

Introducing the Class Interface
Qualifying .NET Types for Interoperation
Interoperating with Unmanaged Code