CA1415: Należy poprawnie zadeklarować P/Invokes
TypeName |
DeclarePInvokesCorrectly |
CheckId |
CA1415 |
Kategoria |
Microsoft.Interoperability |
Zmiana kluczowa |
Niekluczowa - jeśli P/Invoke, który deklaruje parametr nie jest widoczny poza zestawem.Kluczowa - jeśli P/Invoke, który deklaruje parametr jest widoczny poza zestawem. |
Przyczyna
Metoda wywołania platformy jest nieprawidłowo zadeklarowana.
Opis reguły
Metoda wywołania platformy posiada dostęp do kodu niezarządzanego i jest zdefiniowana za pomocą słowa kluczowego Declare w Visual Basic lub DllImportAttribute.Obecnie ta reguła wyszukuje deklaracji metod wywołania platformy, których obiektami docelowymi są funkcje Win32 posiadające wskaźnik do parametru struktury Nakładającej, a odpowiadający parametr zarządzany nie jest wskaźnikiem do struktury NativeOverlapped.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy poprawnie zadeklarować metodę wywołania platformy.
Kiedy pominąć ostrzeżenia
Nie należy pomijać ostrzeżenia dotyczącego tej reguły.
Przykład
W poniższym przykładzie pokazane zostały metody wywołania platformy, które naruszają i spełniają regułę.
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);
}
}