CA1414: пометьте логические аргументы P/Invoke с помощью атрибута MarshalAs
Товар | Значение |
---|---|
Идентификатор правила | CA1414 |
Категория | Microsoft.Interoperability |
Критическое изменение | Критическое |
Причина
Объявление метода вызова платформы включает System.Boolean параметр или возвращаемое значение, но System.Runtime.InteropServices.MarshalAsAttribute атрибут не применяется к параметру или возвращаемого значения.
Описание правила
Платформа вызывает метод доступа к неуправляемом коду и определяется с помощью Declare
ключевое слово в Visual Basic или .System.Runtime.InteropServices.DllImportAttribute MarshalAsAttribute указывает поведение маршалинга, используемое для преобразования типов данных между управляемым и неуправляемным кодом. Многие простые типы данных, такие как System.Byte и System.Int32, имеют единое представление в неуправляемом коде и не требуют спецификации их маршалинга поведения; среда CLR автоматически предоставляет правильное поведение.
Тип Boolean данных имеет несколько представлений в неуправляемом коде. MarshalAsAttribute Если параметр не указан, поведение маршалинга по умолчанию для Boolean типа данных равноSystem.Runtime.InteropServices.UnmanagedType. Это 32-разрядное целое число, которое не подходит во всех обстоятельствах. Логическое представление, необходимое для неуправляемого метода, должно быть определено и сопоставлено с соответствующим System.Runtime.InteropServices.UnmanagedType. UnmanagedType.Bool — это тип BOOL Win32, который всегда равен 4 байтам. Неуправляемый тип.U1 должен использоваться для C++ bool
или других типов 1-байтов.
Устранение нарушений
Чтобы устранить нарушение этого правила, примените MarshalAsAttribute к параметру или возвращаемого Boolean значения. Задайте для атрибута соответствующее UnmanagedTypeзначение.
Когда лучше отключить предупреждения
Для этого правила отключать вывод предупреждений не следует. Даже если поведение маршалинга по умолчанию подходит, код проще поддерживать при явном указании поведения.
Пример
В следующем примере показаны методы вызова платформы, помеченные соответствующими MarshalAsAttribute атрибутами.
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
[ComVisible(true)]
internal class NativeMethods
{
private NativeMethods() {}
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern Boolean MessageBeep(UInt32 uType);
[DllImport("mscoree.dll",
CharSet = CharSet.Unicode,
SetLastError = true)]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool StrongNameSignatureVerificationEx(
[MarshalAs(UnmanagedType.LPWStr)] string wszFilePath,
[MarshalAs(UnmanagedType.U1)] bool fForceVerification,
[MarshalAs(UnmanagedType.U1)] out bool pfWasVerified);
}
}
Связанные правила
CA1901: объявления P/Invoke должны быть переносимыми
CA2101: укажите тип маршалинга для строковых аргументов P/Invoke
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по