CA2137: 透過的メソッドは、検証可能な IL のみを含まなければならない
TypeName |
TransparentMethodsMustBeVerifiable |
CheckId |
CA2137 |
分類 |
Microsoft.Security |
互換性に影響する変更点 |
あり |
原因
メソッドに検証できないコードが含まれているか、メソッドから参照渡しで型が返されます。
規則の説明
この規則は、透過的セキュリティ コードが、検証できない MSIL (Microsoft Intermediate Language) を実行しようとすると適用されます。ただし、規則には完全な IL 検証ツールは含まれていないため、代わりにヒューリスティックを使用して、ほとんどの MSIL 検証違反が検出されます。
検証可能な MSIL のみがコードに含まれていることを確認するには、アセンブリに対して Peverify.exe (PEVerify ツール) を実行します。/transparent オプションを指定して PEVerify を実行すると、出力が、エラーを発生させる可能性がある検証できない透過的メソッドに限定されます。/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;
// }
}
}