不要使用 AutoDual ClassInterfaceType
更新:2007 年 11 月
型別名稱 |
DoNotUseAutoDualClassInterfaceType |
CheckId |
CA1408 |
分類 |
Microsoft.Interoperability |
中斷變更 |
中斷 |
原因
COM 可見型別是以設定為 ClassInterfaceType.AutoDual 之 System.Runtime.InteropServices.ClassInterfaceAttribute 屬性 (Attribute) 所標記的。
規則描述
使用雙重介面 (Dual Interface) 的型別允許用戶端繫結至特定的介面配置。在未來版本中,若型別或任何基底型別 (Base Type) 的配置有所變更,將會中斷繫結至此介面的 COM 用戶端。依照預設,如果未指定 ClassInterfaceAttribute 屬性,則會使用分派介面。
除非已標記,否則所有公用的非泛型型別對 COM 皆為可見的,而所有非公用的泛型型別對 COM 則皆不可見的。
如何修正違規
若要修正此規則的違規情形,請將 ClassInterfaceAttribute 屬性的值變更為 None,並明確地定義此介面。
隱藏警告的時機
除非確定型別及其基底型別的配置在未來版本中不會變更,否則請勿隱藏此規則的警告。
範例
下列範例會顯示違反此規則的類別,並重新宣告類別以便使用明確的介面。
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() {}
}
}