CA1415: правильно объявляйте методы P/Invoke
Товар | Значение |
---|---|
Идентификатор правила | CA1415 |
Категория | Microsoft.Interoperability |
Критическое изменение | Если P/Invoke, объявляющий параметр, не может быть замечен за пределами сборки. Критическое — если P/Invoke, объявляющий параметр, можно увидеть за пределами сборки. |
Причина
Метод вызова платформы объявлен неправильно.
Описание правила
Платформа вызывает метод доступа к неуправляемом коду и определяется с помощью Declare
ключевое слово в Visual Basic или .System.Runtime.InteropServices.DllImportAttribute В настоящее время это правило ищет объявления метода вызова платформы, предназначенные для функций Win32, имеющих указатель на OVERLAPPED
параметр структуры, и соответствующий управляемый параметр не является указателем на System.Threading.NativeOverlapped структуру.
Устранение нарушений
Чтобы устранить нарушение этого правила, правильно объявите метод вызова платформы.
Когда лучше отключить предупреждения
Для этого правила отключать вывод предупреждений не следует.
Пример
В следующем примере показаны методы вызова платформы, которые нарушают правило и удовлетворяют правилу.
using System;
using System.Runtime.InteropServices;
using System.Threading;
namespace InteroperabilityLibrary
{
// The platform invoke methods in this class violate the rule.
[ComVisible(true)]
internal class NativeMethods
{
private NativeMethods() { }
[DllImport("kernel32.dll", SetLastError = true)]
internal extern static uint ReadFile(
IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
IntPtr lpNumberOfBytesRead, IntPtr overlapped);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal extern static bool ReadFileEx(
IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
NativeOverlapped overlapped, IntPtr lpCompletionRoutine);
}
// The platform invoke methods in this class satisfy the rule.
[ComVisible(true)]
internal class UnsafeNativeMethods
{
private UnsafeNativeMethods() { }
//To compile this code, uncomment these lines and compile
//with "/unsafe".
//[DllImport("kernel32.dll", SetLastError = true)]
//unsafe internal extern static uint ReadFile(
// IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
// IntPtr lpNumberOfBytesRead, NativeOverlapped* overlapped);
//[DllImport("kernel32.dll", SetLastError = true)]
//[return: MarshalAs(UnmanagedType.Bool)]
//unsafe internal extern static bool ReadFileEx(
// IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
// NativeOverlapped* overlapped, IntPtr lpCompletionRoutine);
}
}
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по