Freigeben über


CA2137: Transparente Methoden dürfen nur überprüfbare IL enthalten

TypeName

TransparentMethodsMustBeVerifiable

CheckId

CA2137

Kategorie (Category)

Microsoft.Security

Unterbrechende Änderung

Breaking

Ursache

Eine Methode enthält nicht überprüfbaren Code oder gibt einen Typ nach Verweis zurück.

Regelbeschreibung

Diese Regel wird für Versuche durch sicherheitstransparenten Code ausgelöst, nicht überprüfbare MSIL (Microsoft Intermediate Language) auszuführen.Die Regel enthält jedoch kein vollständiges IL-Prüfmodul und verwendet stattdessen Heuristik, um die meisten Verletzungen der MSIL-Überprüfung abzufangen.

Um sicher zu sein, dass der Code nur überprüfbare MSIL enthält, führen Sie Peverify.exe (PEVerify-Tool) auf der Assembly aus.Führen Sie PEVerify mit der /transparent-Option aus, die die Ausgabe auf ausschließlich nicht überprüfbare transparente Methoden beschränkt, die einen Fehler verursachen würden.Wenn die /transparent-Option nicht verwendet wird, überprüft PEVerify auch wichtige Methoden, die nicht überprüfbaren Code enthalten können.

Behandeln von Verstößen

Um eine Verletzung dieser Regel zu korrigieren, markieren Sie die Methode mit dem SecurityCriticalAttribute-Attribut oder dem SecuritySafeCriticalAttribute-Attribut, oder entfernen Sie nicht den überprüfbaren Code.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel

Für die Methode in diesem Beispiel wird nicht überprüfbarer Code verwendet, und sie sollte mit dem SecurityCriticalAttribute-Attribut oder dem SecuritySafeCriticalAttribute-Attribut markiert werden.

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

}