Поделиться через


CA2149: прозрачные методы не следует вызывать в машинном коде

TypeName

TransparentMethodsMustNotCallNativeCode

CheckId

CA2149

Категория

Microsoft.Security

Критическое изменение

Критическое изменение

Причина

Метод вызывает собственную функцию через прототип метода, например P/Invoke.

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

Это правило срабатывает для любого прозрачного метода, который вызывается непосредственно в машинном коде, например, с помощью вызова P/Invoke.Нарушения этого правила могут вызвать исключение MethodAccessException на модели прозрачности 2 уровня и применение полных требований для UnmanagedCode в модели прозрачности 1 уровня.

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

Чтобы устранить нарушение данного правила, отметьте метод, вызывающий машинный код, атрибутом SecurityCriticalAttribute или SecuritySafeCriticalAttribute.

Отключение предупреждений

Для этого правила отключать вывод предупреждений не следует.

Пример

using System;
using System.Runtime.InteropServices;

namespace TransparencyWarningsDemo
{

    public class CallNativeCodeClass
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool Beep(uint dwFreq, uint dwDuration);

        public void CallNativeMethod()
        {
            // CA2149 violation - transparent method calling native code
            Beep(10000, 1);
        }
    }

}