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

См. также