Compartilhar via


CA1415: declarar P/Invokes corretamente

TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

Categoria

Microsoft.Interoperability

Alteração Significativa

Sem-quebras - se o P/Invoke que declara o parâmetro não pode ser consultado fora do assembly.Interromper - se o P/Invoke que declara o parâmetro pode ser consultado fora do assembly.

Causa

Um método de invocação de plataforma for declarado incorretamente.

Descrição da Regra

Um método de invocação de plataforma acessa o código não gerenciado e é definido com a palavra-chave de Declare em Visual Basic ou em DllImportAttribute.Atualmente, esta regra procura as declarações de método de invocação de plataforma que visem as funções do Win32 que têm um ponteiro para um parâmetro SOBREPOR da estrutura e o parâmetro gerenciado correspondente não é um ponteiro para uma estrutura de NativeOverlapped .

Como Corrigir Violações

Para corrigir uma violação desta regra, declarar corretamente o método de invocação de plataforma.

Quando Suprimir Alertas

Não elimine um alerta desta regra.

Exemplo

O exemplo a seguir mostra os métodos de invocação de plataforma que violam a regra e satisfazem a regra.

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

Consulte também

Outros recursos

Interoperação com código não gerenciado