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