CA1407: Com 参照可能な型で静的メンバーを使用しません

TypeName

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

分類

Microsoft.Interoperability

互換性に影響する変更点

なし

原因

コンポーネント オブジェクト モデル (COM: Component Object Model) から参照できると明示的にマークされている型に、public の static メソッドが含まれています。

規則の説明

COM では static メソッドをサポートしていません。

この規則では、プロパティとイベントのアクセサー、演算子をオーバーロードするメソッド、または ComRegisterFunctionAttribute 属性か ComUnregisterFunctionAttribute 属性でマークされているメソッドを無視します。

既定で COM から参照できるものは、アセンブリ、パブリック型、パブリック型のパブリック インスタンス メンバー、パブリック値型のすべてのメンバーです。

この規則を実行するには、次のコードに示すように、アセンブリ レベルの ComVisibleAttribute を false に設定し、クラス レベルの ComVisibleAttribute を true に設定する必要があります。

using System;
using System.Runtime.InteropServices; 

[assembly: ComVisible(false)] 
namespace Samples
{    
    [ComVisible(true)]
    public class MyClass
    {
        public static void DoSomething()
        {
        }
    }
}

違反の修正方法

この規則違反を修正するには、設計を変更し、static メソッドと同じ機能を持つインスタンス メソッドを使用するようにします。

警告を抑制する状況

COM クライアントから、static メソッドで実現される機能にアクセスする必要がない場合、この規則による警告を抑制しても安全です。

違反例

説明

この規則に違反する static メソッドを次の例に示します。

コード

using System;
using System.Runtime.InteropServices;
using System.Collections.ObjectModel; 

[assembly: ComVisible(false)] 

namespace Samples
{    
    [ComVisible(true)]    
    public class Book    
    {        
        private Collection<string> _Pages = new Collection<string>();         

        public Book()        
        {        
        }         

        public Collection<string> Pages        
        {            
            get { return _Pages; }        
        }                

        // Violates this rule         
        public static Book FromPages(string[] pages)        
        {            
            if (pages == null)                
                throw new ArgumentNullException("pages");             

            Book book = new Book();             

            foreach (string page in pages)            
            {                
                book.Pages.Add(page);            
            }             return book;        
        }    
    }
}

コメント

この例では、COM から Book.FromPages メソッドを呼び出すことはできません。

修正例

説明

前の例の規則違反を修正するには、違反しているメソッドをインスタンス メソッドに変更する方法がありますが、この例の場合には、変更しても意味がありません。この問題を解決するには、違反しているメソッドに ComVisible(false) を明示的に適用し、このメソッドが COM から参照できないことを明確にします。

ComRegisterFunctionAttribute をメソッドに適用する例を次に示します。

コード

using System;
using System.Runtime.InteropServices;
using System.Collections.ObjectModel;

[assembly: ComVisible(false)]

namespace Samples
{
    [ComVisible(true)]
    public class Book
    {
        private Collection<string> _Pages = new Collection<string>();

        public Book()
        {
        }

        public Collection<string> Pages
        {
            get { return _Pages; }
        }

        [ComVisible(false)]
        public static Book FromPages(string[] pages)
        {
            if (pages == null)
                throw new ArgumentNullException("pages");

            Book book = new Book();

            foreach (string page in pages)
            {
                book.Pages.Add(page);
            }

            return book;
        }
    }
}

関連規則

CA1017: アセンブリに ComVisibleAttribute を設定します

CA1406: Visual Basic 6 クライアントに対しては Int64 引数を使用しません

CA1413: Com 参照可能な値型ではパブリックでないフィールドを使用しません

参照

その他の技術情報

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