CA1403: Auto 配置の型を COM 参照可能にすることはできません
TypeName |
AutoLayoutTypesShouldNotBeComVisible |
CheckId |
CA1403 |
カテゴリ |
Microsoft.Interoperability |
互換性に影響する変更点 |
あり |
原因
コンポーネント オブジェクト モデル (COM: Component Object Model) から参照可能な値型が、LayoutKind.Auto に設定された System.Runtime.InteropServices.StructLayoutAttribute 属性でマークされています。
規則の説明
Auto レイアウト型は、共通言語ランタイムによって管理されています。 これらの型のレイアウトは .NET Framework のバージョンによって異なる場合があるため、特定のレイアウトを必要とする COM クライアントが動作しなくなる可能性があります。 StructLayoutAttribute 属性が指定されていない場合、C#、Visual Basic、および C++ のコンパイラが Sequential レイアウトを値型に指定することに注意してください。
特にマークされていない限り、すべてのパブリックな非ジェネリック型は、COM 参照可能ですが、すべての非パブリックなジェネリック型は COM 参照不可能です。 ただし、誤った規則違反のレポートを減らすために、この規則では、COM から参照できる型を明示的に示す必要があります。包含アセンブリは、System.Runtime.InteropServices.ComVisibleAttribute を false に設定してマークし、型は、ComVisibleAttribute を true に設定してマークする必要があります。
違反の修正方法
この規則違反を修正するには、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 を使用しないでください