CA1407: Com 参照可能な型で静的メンバーを使用しません
適用対象:Visual Studio
Visual Studio for Mac
Visual Studio Code
項目 | [値] |
---|---|
規則 ID | CA1407 |
カテゴリ | Microsoft.Interoperability |
互換性に影響する変更点 | なし |
原因
コンポーネント オブジェクト モデル (COM) から参照できると明確にマークされている型に、public``static
メソッドが含まれています。
規則の説明
COM では static
メソッドをサポートしていません。
この規則では、プロパティとイベントのアクセサー、演算子オーバーロード メソッド、または System.Runtime.InteropServices.ComRegisterFunctionAttribute 属性または System.Runtime.InteropServices.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;
}
}
}
コメント
この例では、 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 参照可能な値型ではパブリックでないフィールドを使用しません