다음을 통해 공유


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

TypeName

PInvokeEntryPointsShouldExist

CheckId

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