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