다음을 통해 공유


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

업데이트: 2007년 11월

TypeName

AvoidStaticMembersInComVisibleTypes

CheckId

CA1407

범주

Microsoft.Interoperability

변경 수준

NonBreaking

원인

COM에 노출되도록 특별히 표시된 형식에 publicstatic 메서드가 들어 있습니다.

규칙 설명

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

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

기본적으로 어셈블리, public 형식, public 형식의 public 인스턴스 멤버, public 값 형식의 모든 멤버는 COM에 노출됩니다.

이러한 규칙을 실행하려면 다음 코드와 같이 어셈블리 수준 ComRegisterFunctionAttribute를 false로 설정하고 클래스 ComRegisterFunctionAttribute를 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;
        }
    }
}

관련 규칙

어셈블리를 ComVisibleAttribute로 표시하십시오.

Visual Basic 6 클라이언트에서는 Int64 인수를 사용하지 마십시오.

COM 노출 값 형식에 public이 아닌 필드를 사용하지 마십시오.

참고 항목

기타 리소스

비관리 코드와의 상호 운용