CA1415: P/Invokes korrekt deklarieren
TypeName |
DeclarePInvokesCorrectly |
CheckId |
CA1415 |
Kategorie |
Microsoft.Interoperability |
Unterbrechende Änderung |
Nicht unterbrechend – Wenn das P/Invoke, das den Parameter deklariert, außerhalb der Assembly nicht sichtbar ist. Nicht unterbrechend – Wenn das P/Invoke, das den Parameter deklariert, außerhalb der Assembly sichtbar ist. |
Ursache
Eine Plattformaufrufmethode wurde falsch deklariert.
Regelbeschreibung
Eine Plattformaufrufmethode greift auf nicht verwalteten Code zu und wird mit dem Declare-Schlüsselwort in Visual Basic oder dem System.Runtime.InteropServices.DllImportAttribute definiert. Derzeit sucht diese Regel nach Deklarationen für eine Plattformaufrufmethode, die Win32-Funktionen mit einem Zeiger auf einen OVERLAPPED-Strukturparameter zum Ziel haben, der zugehörige verwaltete Parameter ist jedoch kein Zeiger auf eine System.Threading.NativeOverlapped-Struktur.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, deklarieren Sie die Plattformaufrufmethode korrekt.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Beispiel
Im folgenden Beispiel werden Plattformaufrufmethoden veranschaulicht, die gegen die Regel verstoßen und die Regel einhalten.
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);
}
}