CA1415: P/Invoke를 올바르게 선언하십시오.
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);
}
}