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);
}
}
}
관련 규칙
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기