CA1400: P/Invoke 진입점이 있어야 합니다.

항목
RuleId CA1400
범주 Microsoft.Interoperability
주요 변경 내용 주요 변경 아님

원인

public 또는 protected 메서드가 System.Runtime.InteropServices.DllImportAttribute로 표시되었습니다. 관리되지 않는 라이브러리를 찾을 수 없거나 해당 메서드와 라이브러리의 함수가 일치하지 않습니다. 이 규칙은 지정된 정확한 메서드 이름을 찾을 수 없는 경우 메서드 이름에 ‘A’ 또는 ‘W’ 접미사를 추가하여 메서드의 ANSI 또는 와이드 문자 버전을 찾습니다. 일치 항목이 없는 경우 규칙은 __stdcall 이름 형식(_MyMethod@12, 여기서 12는 인수의 길이를 나타냄)을 사용하여 함수를 찾으려고 시도합니다. 일치 항목이 없고 메서드 이름이 ‘#’으로 시작하는 경우 규칙은 이름 참조 대신 서수 참조로 함수를 검색합니다.

참고 항목

이 규칙은 더 이상 사용되지 않습니다. 자세한 내용은 사용되지 않는 규칙을 참조하세요.

규칙 설명

DllImportAttribute로 표시된 메서드가 참조된 비관리형 DLL에 있는지 확인하는 컴파일 시간 검사를 사용할 수 없습니다. 지정한 이름의 함수가 라이브러리에 없거나 메서드의 인수가 함수 인수와 일치하지 않는 경우 공용 언어 런타임에서 예외가 throw됩니다.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 DllImportAttribute 특성이 있는 메서드를 수정합니다. 비관리형 라이브러리가 존재하고 메서드를 포함하는 어셈블리와 동일한 디렉터리에 있는지 확인합니다. 라이브러리가 있고 올바르게 참조된 경우 메서드 이름, 반환 형식, 인수 시그니처가 라이브러리 함수와 일치하는지 확인합니다.

경고를 표시하지 않는 경우

비관리형 라이브러리가 해당 라이브러리를 참조하는 관리형 어셈블리와 동일한 디렉터리에 있는 경우 이 규칙의 경고를 표시합니다. 비관리형 라이브러리를 찾을 수 없는 경우에는 이 규칙의 경고를 표시하지 않아도 될 수 있습니다.

예시

다음 예제에서는 규칙을 위반하는 형식을 보여 줍니다. 이름이 DoSomethingUnmanaged인 함수가 kernel32.dll에서 발생하지 않습니다.

using System.Runtime.InteropServices;

namespace InteroperabilityLibrary
{
   public class NativeMethods
   {
      // If DoSomethingUnmanaged does not exist, or has 
      // a different signature or return type, the following 
      // code violates rule PInvokeEntryPointsShouldExist.
      [DllImport("kernel32.dll")]
      public static extern void DoSomethingUnmanaged();
   }
}

참고 항목

System.Runtime.InteropServices.DllImportAttribute