CA1415: P/Invokes korrekt deklarieren

TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

Kategorie (Category)

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 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 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);
    }
}

Siehe auch

Weitere Ressourcen

Interoperation mit nicht verwaltetem Code