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);
}
}
}
Связанные правила
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по