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

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

原因

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

規則の説明

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

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

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

この規則の発動には、 次のコードに示すように、アセンブリ レベルの ComVisibleAttributefalse に設定され、クラス レベルの ComVisibleAttributetrue に設定されている必要があります。

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;        
        }    
    }
}

コメント

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

修正の例

説明

前の例の違反を修正するために、メソッドをインスタンス メソッドに変更することもできますが、このインスタンスでは意味がありません。 より適切な解決策は、メソッドに 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 参照可能な値型ではパブリックでないフィールドを使用しません

関連項目

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