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 参照可能な値型ではパブリックでないフィールドを使用しません