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