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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de