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


CA2137: прозрачные методы должны содержать только проверяемые IL

TypeName

TransparentMethodsMustBeVerifiable

CheckId

CA2137

Категория

Microsoft.Security

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

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

Причина

Метод содержит непроверяемый код или возвращает тип по ссылке.

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

Это правило срабатывает при попытках прозрачного кода безопасности выполнить непроверяемый MSIL.Однако это правило не содержит полную проверку IL, и вместо нее использует эвристику для выявления большинства нарушений проверки MSIL.

Чтобы быть уверенным, что код содержит только проверяемый MSIL, запустите средство Peverify.exe (средство PEVerify) для сборки.Выполните PEVerify с параметром /transparent, который ограничивает выходные данные только непроверяемыми прозрачными методами, которые могут вызвать ошибку.Если параметр /transparent не используется, то PEVerify также проверяет критичные методы, которым разрешено содержать непроверяемый код.

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

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

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

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

Пример

В следующем примере метод использует непроверяемый код, и этот метод нужно отметить атрибутом SecurityCriticalAttribute или SecuritySafeCriticalAttribute.

using System;
using System.Security;


namespace TransparencyWarningsDemo
{

    public class UnverifiableMethodClass
    {
        // CA2137 violation - transparent method with unverifiable code.  This method should become critical or 
        // safe critical  
    //    public unsafe byte[] UnverifiableMethod(int length) 
    //    { 
    //        byte[] bytes = new byte[length]; 
    //        fixed (byte* pb = bytes) 
    //        { 
    //            *pb = (byte)length; 
    //        } 

    //        return bytes; 
    //    }
    }

}