CA2137:透明方法必须仅包含可验证 IL

类型名

TransparentMethodsMustBeVerifiable

CheckId

CA2137

类别

Microsoft.Security

是否重大更改

原因

某个方法包含无法验证的代码或通过引用返回类型。

规则说明

在尝试通过安全透明代码执行无法验证的 MSIL(Microsoft 中间语言)时将引发此规则。 但是,此规则不包含完整的 IL 验证程序,而是使用试探法来捕捉 MSIL 验证的大部分冲突。

若需要确保您的代码包含仅可验证的 MSIL,请在您的程序集上运行 Peverify.exe(PEVerify 工具)。 使用 /transparent 选项运行 PEVerify,去可限制输出仅为不可验证的透明方法,该方法可导致出错。 如果在未使用 / 透明选项,则 PEVerify 还会验证允许包含不可验证的代码的关键方法。

如何解决冲突

要解决此规则的冲突,使用 SecurityCriticalAttributeSecuritySafeCriticalAttribute 特性标记方法,或删除无法验证的代码。

何时禁止显示警告

不要禁止显示此规则发出的警告。

示例

此示例中的方法使用无法验证的代码,并应使用 SecurityCriticalAttributeSecuritySafeCriticalAttribute 特性标记。

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;
    //    }
    }

}