DynamicMethod'skipVisibility'会有性能损失吗?

时间:2017-11-09 22:17:21

标签: c# cil emit dynamicmethod dynamic-method

C#中创建DynamicMethod时,如果不需要绕过可见性或不相关,那么为 skipVisibility 指定的最佳值是什么? DynamicMethod构造函数的参数?是否存在性能损失,即与运行时安全性需求相关联,为 skipVisibility 指定true,如果是,则每次都会发生惩罚在第一次访问之前打电话,或者只是在JIT时间一次?

MSDN doc:DynamicMethod

1 个答案:

答案 0 :(得分:0)

我在DynamicMethod .NET 参考源中找到了一些相关代码。如下所示,指定skipVisibility会强制ReflectionPermission的安全需求。 (该代码还有另一种情况,无论skipVisibility参数如何,都需要此权限。)

[SecurityCritical]
private void PerformSecurityCheck(Type owner, ref StackCrawlMark stackMark, bool skipVisibility)
{
    if (owner == null)
        throw new ArgumentNullException("owner");

    RuntimeType underlyingSystemType = owner as RuntimeType;
    if (underlyingSystemType == null)
        underlyingSystemType = owner.UnderlyingSystemType as RuntimeType;

    if (underlyingSystemType == null)
        throw new ArgumentNullException("owner", Environment.GetResourceString("Argument_MustBeRuntimeType"));

    RuntimeType callerType = RuntimeMethodHandle.GetCallerType(ref stackMark);
    if (skipVisibility)
        new ReflectionPermission(ReflectionPermissionFlag.MemberAccess).Demand();
    else if (callerType != underlyingSystemType)
        new ReflectionPermission(ReflectionPermissionFlag.MemberAccess).Demand();

    this.m_creatorAssembly = callerType.GetRuntimeAssembly();
    if (underlyingSystemType.Assembly != this.m_creatorAssembly)
        CodeAccessSecurityEngine.ReflectionTargetDemandHelper(PermissionType.SecurityControlEvidence, owner.Assembly.PermissionSet);
}

因此,答案是在为skipVisibility指定 true 时可能会有性能损失。但是,根据您对new DynamicMethod(...)使用的各种其他参数类型以及您发出的IL,您的DynamicMethod实际上可能需要 ReflectionPermission,并且您将无法指定 false 。在这种情况下给出的错误是:

  

System.TypeAccessException 安全透明方法'DynamicClass.foo(MyType,int)'尝试访问安全关键类型'MyType'失败。