CA1407: COM 노출 형식에 정적 멤버를 사용하지 마십시오.
항목 | 값 |
---|---|
RuleId | CA1407 |
범주 | Microsoft.Interoperability |
주요 변경 내용 | 주요 변경 아님 |
원인
구체적으로 COM(구성 요소 개체 모델) 노출로 표시된 형식에 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에서 호출할 수 없습니다.
위반 문제 해결 예제
설명
이전 예제의 위반 문제를 해결하기 위해 메서드를 인스턴스 메서드로 변경할 수 있지만, 이 경우에는 타당하지 않습니다. COM에서 메서드를 볼 수 없음을 다른 개발자에게 명확히 알리기 위해 메서드에 ComVisible(false)
을 명시적으로 적용하는 것이 더 나은 해결 방법입니다.
다음 예제에서는 메서드에 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 노출 값 형식에 public이 아닌 필드를 사용하지 마십시오.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기