CA2205: используйте управляемые эквиваленты API Win32

Товар Значение
Идентификатор правила CA2205
Категория Microsoft.Usage
Критическое изменение Не критическое

Причина

Определяется метод вызова платформы, а метод с эквивалентной функциональностью существует в .NET.

Описание правила

Метод вызова платформы используется для вызова неуправляемой функции DLL и определяется с помощью System.Runtime.InteropServices.DllImportAttribute атрибута или Declare ключевое слово в Visual Basic. Неправильно определенный метод вызова платформы может привести к исключениям во время выполнения из-за проблем, таких как неправильно именованная функция, неисправное сопоставление параметров и типов возвращаемых значений, а также неправильные спецификации полей, такие как соглашение о вызове и набор символов. Если доступно, это проще и меньше ошибок, подверженных вызову эквивалентного управляемого метода, чем определять и вызывать неуправляемый метод напрямую. Вызов метода вызова платформы также может привести к дополнительным проблемам безопасности, которые необходимо устранить.

Устранение нарушений

Чтобы устранить нарушение этого правила, замените вызов неуправляемой функции вызовом управляемого эквивалента.

Когда лучше отключить предупреждения

Отключайте предупреждение из этого правила, если предлагаемый метод замены не предоставляет необходимые функциональные возможности.

Пример

В следующем примере показано определение метода вызова платформы, которое нарушает правило. Кроме того, отображаются вызовы метода вызова платформы и эквивалентного управляемого метода.

using System;
using System.Runtime.InteropServices;
using System.Text;

namespace UsageLibrary
{
   internal class NativeMethods
   {
      private NativeMethods() {}

      // The following method definition violates the rule.
      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, 
          SetLastError = true)]
      internal static extern int ExpandEnvironmentStrings(
         string lpSrc, StringBuilder lpDst, int nSize);
   }

   public class UseNativeMethod
   {
      public void Test()
      {
         string environmentVariable = "%TEMP%";
         StringBuilder expandedVariable = new StringBuilder(100);

         // Call the unmanaged method.
         NativeMethods.ExpandEnvironmentStrings(
            environmentVariable, 
            expandedVariable, 
            expandedVariable.Capacity);

         // Call the equivalent managed method.
         Environment.ExpandEnvironmentVariables(environmentVariable);
      }
   }
}