Compartilhar via


Declarar P/Invokes corretamente

TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

Category (Categoria)

Microsoft.interoperabilidade

Quebrando alterar

Não quebra - se P/Invoke, que declara o parâmetro não é visível fora do assembly.Breaking - se o P/Invoke que declara o parâmetro está visível fora do assembly.

Causa

Uma plataforma de invocar o método foi declarado incorretamente.

Descrição da regra

Uma invocação de plataforma código não gerenciado do método acessos e é definida usando o Declare palavra-chave no Visual Basic ou o System.Runtime.InteropServices.DllImportAttribute. No momento, esta regra examina para declarações de método funções Win32 de destino que possuem um ponteiro para um OVERLAPPED estruturar parâmetro de invocação de plataforma e o parâmetro gerenciado correspondente não é um ponteiro para um System.Threading.NativeOverlapped estrutura.

Como corrigir violações

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

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo

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

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