DynamicMethod.IsSecurityCritical 属性

定义

获取一个值,该值指示当前的动态方法是否为安全关键或安全可靠关键,以执行关键操作。

public:
 virtual property bool IsSecurityCritical { bool get(); };
public override bool IsSecurityCritical { get; }
member this.IsSecurityCritical : bool
Public Overrides ReadOnly Property IsSecurityCritical As Boolean

属性值

如果当前的动态方法是安全关键或安全可靠关键,则为 true;如果它是透明的,则为 false

例外

动态方法没有方法体。

注解

IsSecurityCriticalIsSecuritySafeCriticalIsSecurityTransparent 属性报告由公共语言运行时 (CLR) 确定的动态方法的透明度级别。 下表显示了这些属性的组合:

安全级别 IsSecurityCritical IsSecurityCritical IsSecurityTransparent
严重 true false false
安全关键 true true false
透明 false false true

使用这些属性比检查程序集及其类型的安全批注、检查当前的信任级别,以及尝试复制运行时的规则要简单得多。

动态方法的透明度取决于与之关联的模块。 如果动态方法与类型(而不是模块)关联,则其透明度取决于包含该类型的模块。 动态方法没有安全注释,因此会为其分配关联模块的默认透明度。

  • 匿名托管的动态方法始终是透明的,因为包含它们的系统提供的模块是透明的。

  • 下表描述了与受信任的程序集关联的动态方法的透明度 (即全局程序集缓存中安装的强名称程序集) 。

    程序集批注 级别 1 透明度 级别 2 透明度
    完全透明 透明 透明
    完全关键 严重 严重
    混合透明度 透明 透明
    与安全无关 安全-关键 严重

    例如,如果将动态方法与 mscorlib.dll 中具有 2 级混合透明度的类型相关联,则动态方法是透明的,并且无法执行关键代码。 有关透明度级别的信息,请参阅 安全透明代码级别 1 和安全 透明代码级别 2

    注意

    将动态方法与受信任的级别 1 程序集中与安全无关的模块(例如 System.dll)关联不允许提升信任。 如果调用动态方法的代码的授予集不包括 System.dll (调用动态方法时将引发完全信任) SecurityException

  • 与部分受信任的程序集关联的动态方法的透明度取决于程序集的加载方式。 例如,如果程序集使用部分信任 (加载到沙盒应用程序域) ,运行时将忽略程序集的安全注释。 程序集及其所有类型和成员(包括动态方法)被视为透明。 仅当部分信任程序集以完全信任 (加载到桌面应用程序) 的默认应用程序域中时,运行时才会注意安全注释。 在这种情况下,运行时根据程序集的注释为动态方法分配方法的默认透明度。

有关反射发出和透明度的详细信息,请参阅 反射发出中的安全问题。 有关透明度的信息,请参阅 安全更改

适用于

另请参阅