다음을 통해 공유


COM 노출 인터페이스에서 오버로드를 사용하지 마십시오.

업데이트: 2007년 11월

TypeName

AvoidOverloadsInComVisibleInterfaces

CheckId

CA1402

범주

Microsoft.Interoperability

변경 수준

주요 변경

원인

COM 노출 인터페이스에서 오버로드된 메서드를 선언합니다.

규칙 설명

오버로드된 메서드가 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);
   }
}

관련 규칙

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

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

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

참고 항목

참조

Long 데이터 형식(Visual Basic)

기타 리소스

비관리 코드와의 상호 운용