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


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

Товар Значение
Идентификатор правила 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);
        }
    }

}