CA1415: Správně deklarovat P/Invokes
TypeName |
DeclarePInvokesCorrectly |
CheckId |
CA1415 |
Kategorie |
Microsoft.interoperability |
Narušující změna |
Nenarušující - není-li službu P/Invoke deklarující parametr vidět mimo sestavení.Narušující - je-li službu P/Invoke deklarující parametr vidět mimo sestavení. |
Příčina
Nesprávně deklarovaná metoda P/Invoke.
Popis pravidla
Metoda P/Invoke přistupuje k nespravovanému kódu, přičemž je definována pomocí klíčového slova Declare v jazyce Visual Basic nebo atributem System.Runtime.InteropServices.DllImportAttribute.V současné době toto pravidlo hledá deklarace metod P/Invoke zacílených na funkce Win32, které obsahují ukazatel na parametr struktury OVERLAPPED, přičemž odpovídající spravovaný parametr není ukazatelem na strukturu System.Threading.NativeOverlapped.
Jak vyřešit porušení
Chcete-li opravit porušení tohoto pravidla, deklarujte správně metodu P/Invoke.
Kdy potlačit upozornění
Nepotlačujte upozornění na toto pravidlo.
Příklad
Následující příklad ukazuje metody P/Invoke porušující i splňující toto pravidlo.
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);
}
}