CA2205: Win32 API에 있는 동일한 기능의 관리되는 항목을 사용하십시오.

항목
RuleId CA2205
범주 Microsoft.Usage
주요 변경 내용 주요 변경 아님

원인

플랫폼 호출 메서드가 정의되었는데 동일한 기능의 메서드가 .NET에 있습니다.

규칙 설명

플랫폼 호출 메서드는 비관리형 DLL 함수를 호출하는 데 사용되며 System.Runtime.InteropServices.DllImportAttribute 특성이나 Visual Basic의 Declare 키워드를 사용하여 정의됩니다. 플랫폼 호출 메서드를 잘못 정의하면 잘못된 이름의 함수, 매개 변수와 반환 값 데이터 형식의 잘못된 매핑, 잘못된 필드 사양(예: 호출 규칙, 문자 집합)과 같은 문제로 인해 런타임 예외가 발생할 수 있습니다. 사용 가능한 경우 비관리형 메서드를 직접 정의하고 호출하는 것보다 해당하는 관리형 메서드를 호출하는 것이 더 간단하고 오류가 적게 발생합니다. 플랫폼 호출 메서드를 호출하는 경우 해결해야 하는 추가 보안 문제도 발생할 수 있습니다.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 비관리형 함수 호출을 해당하는 관리형 함수 호출로 바꿉니다.

경고를 표시하지 않는 경우

제안된 대체 메서드가 필요한 기능을 제공하지 않는 경우 이 규칙의 경고를 표시하지 않습니다.

예시

다음 예제에서는 규칙을 위반하는 플랫폼 호출 메서드 정의를 보여 줍니다. 플랫폼 호출 메서드와 해당하는 관리형 메서드 호출도 나와 있습니다.

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);
      }
   }
}