CA2134: メソッドは、基本メソッドをオーバーライドしている場合、透過性の整合性を保つ必要がある
TypeName |
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() { }
}
}