다음을 통해 공유


P/Invoke를 올바르게 선언하십시오.

업데이트: 2007년 11월

TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

범주

Microsoft.Interoperability

변경 수준

주요 변경 아님 - 매개 변수를 선언하는 P/Invoke가 어셈블리 외부에 표시되지 않는 경우, 주요 변경 - 매개 변수를 선언하는 P/Invoke가 어셈블리 외부에 표시되는 경우

원인

플랫폼 호출 메서드가 잘못 선언되었습니다.

규칙 설명

플랫폼 호출 메서드가 비관리 코드에 액세스하고 Visual Basic의 Declare 키워드 또는 System.Runtime.InteropServices.DllImportAttribute를 사용하여 선언되었습니다. 현재 이 규칙에서는 OVERLAPPED 구조체 매개 변수에 대한 포인터가 있는 Win32 함수를 대상으로 하는 플랫폼 호출 메서드 선언을 찾는데 해당 관리 매개 변수가 System.Threading.NativeOverlapped 구조체에 대한 포인터가 아닙니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 플랫폼 호출 메서드를 올바르게 선언합니다.

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시해야 합니다.

예제

다음 예제에서는 이 규칙을 위반하는 플랫폼 호출 메서드와 이 규칙을 충족하는 플랫폼 호출 메서드를 보여 줍니다.

using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace InteroperabilityLibrary
{
    // The platform invoke methods in this class violate the rule.
    [ComVisible(true)]
    internal class NativeMethods
    {
        private NativeMethods() { }

        [DllImport("kernel32.dll", SetLastError = true)]
        internal extern static uint ReadFile(
           IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
           IntPtr lpNumberOfBytesRead, IntPtr overlapped);

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal extern static bool ReadFileEx(
           IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
           NativeOverlapped overlapped, IntPtr lpCompletionRoutine);
    }

    // The platform invoke methods in this class satisfy the rule.
    [ComVisible(true)]
    internal class UnsafeNativeMethods
    {
        private UnsafeNativeMethods() { }

        //To compile this code, uncomment these lines and compile
        //with "/unsafe".
        //[DllImport("kernel32.dll", SetLastError = true)]
        //unsafe internal extern static uint ReadFile(
        //   IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
        //   IntPtr lpNumberOfBytesRead, NativeOverlapped* overlapped);

        //[DllImport("kernel32.dll", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //unsafe internal extern static bool ReadFileEx(
        //   IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
        //   NativeOverlapped* overlapped, IntPtr lpCompletionRoutine);
    }
}

참고 항목

기타 리소스

비관리 코드와의 상호 운용