共用方式為


CA2134:覆寫基底方法時,方法必須保持一致的透明度

型別名稱

MethodsMustOverrideWithConsistentTransparency

CheckId

CA2134

分類

Microsoft.Security

中斷變更

中斷

原因

當標記 SecurityCriticalAttribute 的方法覆寫透明或標記 SecuritySafeCriticalAttribute 的方法時,就會引發這個規則。透明或標記 SecuritySafeCriticalAttribute 的方法覆寫標記 SecurityCriticalAttribute 的方法時,也會引發規則。

覆寫虛擬方法或實作介面時會套用此規則。

規則描述

嘗試變更繼承鏈結上一層方法的安全性存取範圍時,就會引發這個規則。例如,如果基底類別中的虛擬方法是透明的或安全關鍵,衍生類別就必須以透明的或安全關鍵方法覆寫它。相反地,如果虛擬具有安全性關鍵,衍生類別必須以安全性關鍵方法覆寫它。實作介面方法適用相同的規則。

當程式碼是 JIT 編譯而不是在執行階段時編譯 (因此透明度計算不具有動態型別資訊),就會強制透明度規則。因此,透明度計算結果必須能只從 JIT 編譯的靜態型別決定,而不論其動態型別。

如何修正違規

若要修正此規則的違規情形,請變更方法的透明度,此方法會覆寫虛擬方法或實作介面,以比對虛擬或介面方法的透明度。

隱藏警告的時機

不隱藏此規則的警告。違反這個規則會導致使用層級 2 透明度的組件發生執行階段 TypeLoadException

範例

程式碼

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public interface IInterface
    {
        void TransparentInterfaceMethod();

        [SecurityCritical]
        void CriticalInterfaceMethod();
    }

    public class Base
    {
        public virtual void TransparentVirtual() { }

        [SecurityCritical]
        public virtual void CriticalVirtual() { }
    }

    public class Derived : Base, IInterface
    {
        // CA2134 violation - implementing a transparent method with a critical one.  This can be fixed by any of: 
        //   1. Making IInterface.TransparentInterfaceMethod security critical 
        //   2. Making Derived.TransparentInterfaceMethod transparent 
        //   3. Making Derived.TransparentInterfaceMethod safe critical
        [SecurityCritical]
        public void TransparentInterfaceMethod() { }

        // CA2134 violation - implementing a critical method with a transparent one.  This can be fixed by any of: 
        //   1. Making IInterface.CriticalInterfaceMethod transparent 
        //   2. Making IInterface.CriticalInterfaceMethod safe critical 
        //   3. Making Derived.TransparentInterfaceMethod critical 
        public void CriticalInterfaceMethod() { }

        // CA2134 violation - overriding a transparent method with a critical one.  This can be fixed by any of: 
        //   1. Making Base.TrasnparentVirtual critical 
        //   2. Making Derived.TransparentVirtual transparent 
        //   3. Making Derived.TransparentVirtual safe critical
        [SecurityCritical]
        public override void TransparentVirtual() { }

        // CA2134 violation - overriding a critical method with a transparent one.  This can be fixed by any of: 
        //   1. Making Base.CriticalVirtual transparent 
        //   2. Making Base.CriticalVirtual safe critical 
        //   3. Making Derived.CriticalVirtual critical 
        public override void CriticalVirtual() { }
    }

}

請參閱

概念

安全性透明的程式碼,層級 2