다음을 통해 공유


CA1407: COM 노출 형식에 정적 멤버를 사용하지 마십시오.

TypeName

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

범주

Microsoft.Interoperability

변경 수준

주요 변경 아님

원인

COM(Component Object Model)에 노출되도록 특별히 표시된 형식에 public static 메서드가 들어 있습니다.

규칙 설명

COM에서는 static 메서드를 지원하지 않습니다.

이 규칙에서는 속성 및 이벤트 접근자, 연산자 오버로드 메서드 또는 System.Runtime.InteropServices.ComRegisterFunctionAttribute 특성이나 System.Runtime.InteropServices.ComUnregisterFunctionAttribute 특성으로 표시된 메서드를 무시합니다.

기본적으로 어셈블리, public 형식, public 형식의 public 인스턴스 멤버, public 값 형식의 모든 멤버는 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: ComVisible 값 형식에 public이 아닌 필드를 사용하지 마십시오.

참고 항목

기타 리소스

비관리 코드와의 상호 운용