CA2137:透明方法必须仅包含可验证 IL
类型名 |
TransparentMethodsMustBeVerifiable |
CheckId |
CA2137 |
类别 |
Microsoft.Security |
是否重大更改 |
是 |
原因
某个方法包含无法验证的代码或通过引用返回类型。
规则说明
在尝试通过安全透明代码执行无法验证的 MSIL(Microsoft 中间语言)时将引发此规则。 但是,此规则不包含完整的 IL 验证程序,而是使用试探法来捕捉 MSIL 验证的大部分冲突。
若需要确保您的代码包含仅可验证的 MSIL,请在您的程序集上运行 Peverify.exe(PEVerify 工具)。 使用 /transparent 选项运行 PEVerify,去可限制输出仅为不可验证的透明方法,该方法可导致出错。 如果在未使用 / 透明选项,则 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;
// }
}
}