共用方式為


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

型別名稱

MethodsMustOverrideWithConsistentTransparency

CheckId

CA2134

分類

Microsoft.Security

中斷變更

中斷

原因

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

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

規則描述

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

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

如何修正違規

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

隱藏警告的時機

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

範例

Dd997447.collapse_all(zh-tw,VS.110).gif程式碼

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