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.ComVisibleAttribute を false
に設定してマークする必要があり、型は ComVisibleAttribute を true
に設定してマークする必要があります。
違反の修正方法
この規則の違反を修正するには、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 を使用しないでください
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示