Partilhar via


CA1400: Os pontos de entrada de P/Invoke devem existir.

TypeName

PInvokeEntryPointsShouldExist

CheckId

CA1400

<strong>Categoria</strong>

Microsoft.Interoperability

Alteração significativa

Não-separável

Causa

Um método público ou protegido é marcado com o System.Runtime.InteropServices.DllImportAttribute. A biblioteca não gerenciada não pôde ser localizada ou o método não pôde ser correspondido para uma função na biblioteca. Se a regra não é possível localizar o nome do método exatamente como ele é especificado, ele procura ANSI ou versões de caracteres largos do método colocando o sufixo de nome de método com 'A' ou 'W'. Se nenhuma correspondência for encontrada, a regra para tenta localizar uma função usando o formato de nome de __stdcall (_MyMethod@12, onde 12 representa o comprimento dos argumentos). Se nenhuma correspondência for encontrada e o nome do método começa com '#', a regra de pesquisa para a função como uma referência ordinal em vez de uma referência de nome.

Descrição da regra

Nenhuma verificação de tempo de compilação está disponível para certificar-se de que os métodos são marcados com DllImportAttribute estão localizados no referenciado não gerenciado DLL. Se nenhuma função que tem o nome especificado está na biblioteca ou os argumentos para o método não coincidem com os argumentos da função, o common language runtime lança uma exceção.

Como corrigir violações

Para corrigir uma violação desta regra, corrigir o método que tem o DllImportAttribute atributo. Certifique-se de que 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 corretamente referenciado, verifique se o nome do método, o tipo de retorno e a assinatura de argumento correspondem a função de biblioteca.

Quando suprimir avisos

Não suprimi um aviso da regra quando a biblioteca não gerenciada está no mesmo diretório do assembly gerenciado que faz referência a ele. Ele pode ser seguro eliminar um aviso esta regra no caso em que a biblioteca não gerenciada não pôde ser localizada.

Exemplo

O exemplo a seguir mostra um tipo que viola a regra. Nenhuma função chamada 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();
   }
}

Consulte também

Referência

System.Runtime.InteropServices.DllImportAttribute