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();
}
}
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по