CA1403:自動配置型別不應該是 COM 可見
型別名稱 |
AutoLayoutTypesShouldNotBeComVisible |
CheckId |
CA1403 |
分類 |
Microsoft.Interoperability |
中斷變更 |
中斷 |
原因
元件物件模型 (COM) 可見的實值型別是以設定為 LayoutKind.Auto 的 System.Runtime.InteropServices.StructLayoutAttribute 屬性所標記。
規則描述
Auto 配置型別是由 Common Language Runtime 所管理。 可以在 .NET Framework 的版本間變更這些型別的配置,這將會中斷必須有特定配置的 COM 用戶端。 請注意如果未指定 StructLayoutAttribute 屬性,則 C#、Visual Basic 和 C++ 編譯器會指定實值型別的 Sequential 配置。
除非已標記,否則所有公用的非泛型型別對 COM 皆為可見的,而所有非公用的泛型型別對 COM 則皆不可見的。 但是,為了減少誤報的情形,這項規則要求必須明確陳述此型別的 COM 可視性、必須使用設定為 false 的 System.Runtime.InteropServices.ComVisibleAttribute 來標記包含的組件,而且必須使用設定為 true 的 ComVisibleAttribute 來標記此型別。
如何修正違規
若要修正這項規則的違規情形,請將 StructLayoutAttribute 屬性的值變更為 Explicit 或 Sequential,或標記 COM 看不見的型別。
隱藏警告的時機
請勿隱藏此規則的警告。
範例
下列範例會顯示違反規則的型別和滿足規則的型別。
Imports System
Imports System.Runtime.InteropServices
<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary
' This violates the rule.
<StructLayoutAttribute(LayoutKind.Auto)> _
<ComVisibleAttribute(True)> _
Public Structure AutoLayout
Dim ValueOne As Integer
Dim ValueTwo As Integer
End Structure
' This satisfies the rule.
<StructLayoutAttribute(LayoutKind.Explicit)> _
<ComVisibleAttribute(True)> _
Public Structure ExplicitLayout
<FieldOffsetAttribute(0)> _
Dim ValueOne As Integer
<FieldOffsetAttribute(4)> _
Dim ValueTwo As Integer
End Structure
End Namespace
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
// This violates the rule.
[StructLayout(LayoutKind.Auto)]
[ComVisible(true)]
public struct AutoLayout
{
public int ValueOne;
public int ValueTwo;
}
// This satisfies the rule.
[StructLayout(LayoutKind.Explicit)]
[ComVisible(true)]
public struct ExplicitLayout
{
[FieldOffset(0)]
public int ValueOne;
[FieldOffset(4)]
public int ValueTwo;
}
}
相關規則
CA1408:不要使用 AutoDual ClassInterfaceType