次の方法で共有


CA1403: Auto 配置の型を COM 参照可能にすることはできません

Item [値]
規則 ID CA1403
カテゴリ Microsoft.Interoperability
互換性に影響する変更点 あり

原因

コンポーネント オブジェクト モデル (COM) 参照可能な値型が、System.Runtime.InteropServices.LayoutKind.Auto に設定された System.Runtime.InteropServices.StructLayoutAttribute 属性でマークされています。

規則の説明

LayoutKind 配置の型は、共通言語ランタイムによって管理されます。 これらの型のレイアウトは .NET のバージョンによって異なる場合があるため、特定のレイアウトを必要とする COM クライアントが動作しなくなる可能性があります。 StructLayoutAttribute 属性が指定されていない場合、C#、Visual Basic、C++ のコンパイラでは、値型に LayoutKind.Auto が指定されます。

特に指定されていない限り、パブリックで非ジェネリックの型はすべて COM から参照でき、非パブリック型とジェネリック型はすべて COM から参照できません。 ただし、偽陽性を減らすために、この規則では、型の COM 表示範囲が明示的に指定されている必要があります。 格納アセンブリは、System.Runtime.InteropServices.ComVisibleAttributefalse に設定してマークする必要があり、型は ComVisibleAttributetrue に設定してマークする必要があります。

違反の修正方法

この規則の違反を修正するには、StructLayoutAttribute 属性の値を LayoutKind.Explicit または LayoutKind.Sequential に変更するか、型を COM から参照できないようにします。

どのようなときに警告を抑制するか

この規則による警告は抑制しないでください。

次の例では、この規則に違反する型と、この規則に準拠する型を確認できます。

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

関連項目