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

Товар Значение
Идентификатор правила CA1400
Категория Microsoft.Interoperability
Критическое изменение Не критическое

Причина

Общедоступный или защищенный метод помечается с помощью System.Runtime.InteropServices.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();
   }
}

См. также

System.Runtime.InteropServices.DllImportAttribute