CA1402: COM 노출 인터페이스에서 오버로드를 사용하지 마십시오.
TypeName |
AvoidOverloadsInComVisibleInterfaces |
CheckId |
CA1402 |
범주 |
Microsoft.Interoperability |
변경 수준 |
주요 변경 |
원인
COM(Component Object Model) 노출 인터페이스는 오버로드된 메서드를 선언합니다.
규칙 설명
오버로드된 메서드가 COM 클라이언트에 노출되면 첫 번째 메서드 오버로드만 이름이 유지됩니다.이후의 오버로드는 이름에 밑줄 문자 '_'와 오버로드 선언 순서에 해당하는 정수가 추가되어 고유한 이름이 지정됩니다.예를 들어, 다음 메서드를 확인해 보십시오.
void SomeMethod(int valueOne);
void SomeMethod(int valueOne, int valueTwo, int valueThree);
void SomeMethod(int valueOne, int valueTwo);
이러한 메서드는 COM 클라이언트에 다음과 같이 노출됩니다.
void SomeMethod(int valueOne);
void SomeMethod_2(int valueOne, int valueTwo, int valueThree);
void SomeMethod_3(int valueOne, int valueTwo);
Visual Basic 6 COM 클라이언트는 이름에 밑줄이 있는 인터페이스 메서드를 구현할 수 없습니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 오버로드된 메서드의 이름을 고유한 이름으로 바꿉니다.또는 액세스 가능성을 internal(Visual Basic의 경우 Friend)로 변경하거나 false로 설정된 System.Runtime.InteropServices.ComVisibleAttribute 특성을 적용하여 COM에서 인터페이스를 볼 수 없도록 만듭니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.
예제
다음 예제에서는 규칙을 위반하는 인터페이스와 규칙을 충족하는 인터페이스를 보여 줍니다.
Imports System
Imports System.Runtime.InteropServices
<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary
' This interface violates the rule.
<ComVisibleAttribute(True)> _
Public Interface IOverloadedInterface
Sub SomeSub(valueOne As Integer)
Sub SomeSub(valueOne As Integer, valueTwo As Integer)
End Interface
' This interface satisfies the rule.
<ComVisibleAttribute(True)> _
Public Interface INotOverloadedInterface
Sub SomeSub(valueOne As Integer)
Sub AnotherSub(valueOne As Integer, valueTwo As Integer)
End Interface
End Namespace
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
// This interface violates the rule.
[ComVisible(true)]
public interface IOverloadedInterface
{
void SomeMethod(int valueOne);
void SomeMethod(int valueOne, int valueTwo);
}
// This interface satisfies the rule.
[ComVisible(true)]
public interface INotOverloadedInterface
{
void SomeMethod(int valueOne);
void AnotherMethod(int valueOne, int valueTwo);
}
}
관련 규칙
CA1413: ComVisible 값 형식에 public이 아닌 필드를 사용하지 마십시오.
CA1407: COM 노출 형식에 정적 멤버를 사용하지 마십시오.
CA1017: ComVisibleAttribute로 어셈블리 표시