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 を使用しないでください

参照

概念

クラス インターフェイスの概要

相互運用のための .NET 型の要件

その他の技術情報

アンマネージ コードとの相互運用