Partilhar via


CA1415: Declarar P/Invokes corretamente

TypeName

DeclarePInvokesCorrectly

CheckId

CA1415

<strong>Categoria</strong>

Microsoft.Interoperability

Alteração significativa

Não-separável - se o P/Invoke que declara que o parâmetro não pode ser visto fora do assembly.Quebrando - se o P/Invoke que declara o parâmetro pode ser visto fora do assembly.

Causa

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

Descrição da regra

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

Como corrigir violações

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

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo

A exemplo a seguir mostra os 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

Interoperar com código não gerenciado