Поделиться через


CA1400: необходимо наличие точек входа P/Invoke

TypeName

PInvokeEntryPointsShouldExist

CheckId

CA1400

Категория

Microsoft.Interoperability

Критическое изменение

Не критическое

Причина

Открытый или защищенный метод помечен атрибутом DllImportAttribute.Не удается найти неуправляемую библиотеку либо не удается сопоставить метод функции в библиотеке.Если точно указанное имя метода не найдено, выполняется поиск версий ANSI или версий с двухбайтовыми знаками для метода за счет суффиксации его имени с "A" или "W".Если совпадения отсутствуют, правило предпринимает попытку поиска функции с использованием формата имени "__stdcall" (_MyMethod@12, где 12 — это длина аргументов).Если совпадения отсутствуют, а имя метода начинается с "#", выполняется поиск функции как ссылки на порядковый номер, а не ссылки на имя.

Описание правила

Чтобы убедиться, что отсутствует проверка во время компиляции, методы, помеченные DllImportAttribute находятся в указанной неуправляемой библиотеке DLL.Если в библиотеке не существует функций, имеющих заданное имя, или аргументы метода не соответствуют аргументам функции, среда CLR создает исключение.

Устранение нарушений

Чтобы устранить нарушение данного правила, исправьте метод с атрибутом DllImportAttribute.Проверьте, что неуправляемая библиотека существует и находится в том же каталоге, что и содержащая метод сборка.Если библиотека существует и правильно указана, проверьте, что имя метода, возвращаемый тип и подпись аргумента соответствуют функции библиотеки.

Отключение предупреждений

Если неуправляемая библиотека находится в том же каталоге, что и ссылающаяся на нее управляемая сборка, не отключайте вывод предупреждений для данного правила.В случае, если неуправляемую библиотеку найти не удается, для данного правила можно отключить вывод предупреждений.

Пример

В следующем примере показан тип, который нарушает данное правило.В kernel32.dll отсутствует функция с именем DoSomethingUnmanaged

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

См. также

Ссылки

DllImportAttribute