Compartilhar via


CA1400: os pontos de entrada P/Invoke devem existir

Item Valor
RuleId CA1400
Categoria Microsoft.Interoperability
Alteração da falha Sem interrupção

Causa

Um método público ou protegido é marcado com o System.Runtime.InteropServices.DllImportAttribute. Não foi possível localizar a biblioteca não gerenciada ou não foi possível comparar o método a uma função na biblioteca. Se a regra não conseguir localizar o nome do método exatamente como é especificado, ela procurará versões ANSI ou de caractere amplo do método sufixando o nome do método com 'A' ou 'W'. Se nenhuma correspondência for encontrada, a regra tentará localizar uma função usando o formato de nome __stdcall (_MyMethod@12, em que 12 representa o comprimento dos argumentos). Se nenhuma correspondência for encontrada, e o nome do método começar com '#', a regra procurará a função como uma referência ordinal em vez de uma referência de nome.

Observação

Esta regra foi preterida. Para obter mais informações, confira Regras preteridas.

Descrição da regra

Nenhuma verificação de tempo de compilação está disponível para garantir que os métodos marcados com DllImportAttribute estejam localizados na DLL não gerenciada referenciada. Se nenhuma função que tem o nome especificado estiver na biblioteca ou os argumentos para o método não corresponderem aos argumentos da função, o suporte a Common Language Runtime irá gerar uma exceção.

Como corrigir violações

Para corrigir uma violação dessa regra, corrija o método que tem o atributo DllImportAttribute. Verifique se a biblioteca não gerenciada existe e se está no mesmo diretório que o assembly que contém o método. Se a biblioteca estiver presente e referenciada corretamente, verifique se o nome do método, o tipo de retorno e a assinatura do argumento correspondem à função da biblioteca.

Quando suprimir avisos

Não suprima um aviso dessa regra quando a biblioteca não gerenciada estiver no mesmo diretório que o assembly gerenciado que a referencia. Pode ser seguro suprimir um aviso dessa regra no caso em que a biblioteca não gerenciada não pôde ser localizada.

Exemplo

O seguinte exemplo mostra um tipo que viola a regra. Nenhuma função nomeada DoSomethingUnmanaged ocorre em kernel32.dll.

using System.Runtime.InteropServices;

namespace InteroperabilityLibrary
{
   public class NativeMethods
   {
      // If DoSomethingUnmanaged does not exist, or has 
      // a different signature or return type, the following 
      // code violates rule PInvokeEntryPointsShouldExist.
      [DllImport("kernel32.dll")]
      public static extern void DoSomethingUnmanaged();
   }
}

Confira também

System.Runtime.InteropServices.DllImportAttribute