Freigeben über


P/Invokes korrekt deklarieren

Aktualisiert: November 2007

     TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

Kategorie

Microsoft.Interoperability

Unterbrechende Änderung

Nicht unterbrechend – Wenn P/Invoke, wodurch der Parameter deklariert wird, außerhalb der Assembly nicht sichtbar ist. Unterbrechend – Wenn P/Invoke, wodurch der Parameter deklariert wird, 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 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.

Behandlung 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

Interaktion mit nicht verwaltetem Code