CA1400: необходимо наличие точек входа P/Invoke
TypeName |
PInvokeEntryPointsShouldExist |
CheckId |
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();
}
}