CA1407:避免在 COM 可见类型中使用静态成员

类型名

AvoidStaticMembersInComVisibleTypes

CheckId

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

注释

在此示例中,不能从 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 可见值类型中使用非公共字段

请参见

其他资源

与非托管代码交互操作