CA1412:将 ComSource 接口标记为 IDispatch
类型名 |
MarkComSourceInterfacesAsIDispatch |
CheckId |
CA1412 |
类别 |
Microsoft.Interoperability |
是否重大更改 |
是 |
原因
有一个类型用 ComSourceInterfacesAttribute 特性进行了标记,并且至少有一个指定的接口未用设置为 InterfaceIsDispatch 值的 InterfaceTypeAttribute 特性进行标记。
规则说明
ComSourceInterfacesAttribute 用于标识类向组件对象模型 (COM) 客户端公开的事件接口。这些接口必须公开为 InterfaceIsIDispatch,以便允许 Visual Basic 6 COM 客户端接收事件通知。默认情况下,如果接口未用 InterfaceTypeAttribute 特性进行标记,则它将公开为双重接口。
如何解决冲突
若要修复与该规则的冲突,请针对指定了 ComSourceInterfacesAttribute 特性的所有接口,添加或修改 InterfaceTypeAttribute 特性,以便将它的值设置为 InterfaceIsIDispatch。
何时禁止显示警告
不要禁止显示此规则发出的警告。
示例
下面的示例演示一个类,该类的某个接口与此规则冲突。
Imports Microsoft.VisualBasic
Imports System
Imports System.Runtime.InteropServices
<Assembly: ComVisibleAttribute(True)>
Namespace InteroperabilityLibrary
' This violates the rule for type EventSource.
<InterfaceType(ComInterfaceType.InterfaceIsDual)> _
Public Interface IEventsInterface
Sub EventOne
Sub EventTwo
End Interface
' This satisfies the rule.
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface IMoreEventsInterface
Sub EventThree
Sub EventFour
End Interface
<ComSourceInterfaces( _
"InteroperabilityLibrary.IEventsInterface" & _
ControlChars.NullChar & _
"InteroperabilityLibrary.IMoreEventsInterface")> _
Public Class EventSource
' Event and method declarations.
End Class
End Namespace
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(true)]
namespace InteroperabilityLibrary
{
// This violates the rule for type EventSource.
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IEventsInterface
{
void EventOne();
void EventTwo();
}
// This satisfies the rule.
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMoreEventsInterface
{
void EventThree();
void EventFour();
}
[ComSourceInterfaces(
"InteroperabilityLibrary.IEventsInterface\0" +
"InteroperabilityLibrary.IMoreEventsInterface")]
public class EventSource
{
// Event and method declarations.
}
}
相关规则
CA1408:请不要使用 AutoDual ClassInterfaceType