Есть ли у DynamicMethod skipVisibility снижение производительности?

При создании DynamicMethod в C#, для которого в обход видимости нет необходимости или не имеет значения, какое значение лучше всего указать для параметра skipVisibility объекта DynamicMethod конструктор? Существует ли снижение производительности, т. Е. Связанное с требованием безопасности во время выполнения, для указания true для skipVisibility, и если да, будет ли штраф за каждый вызов или только один раз во время JIT перед первым доступом?

Документ MSDN: DynamicMethod

1 ответ

Я нашел соответствующий код в справочном источнике .NET для DynamicMethod, Как показано ниже, указав 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);
}

Таким образом, ответ будет то, что может быть снижение производительности при указании true для skipVisibility, Однако, в зависимости от различных других типов аргументов, которые вы используете с new DynamicMethod(...) и, возможно, IL, который вы излучаете, ваш DynamicMethod может фактически потребовать ReflectionPermission, и вы не сможете указать false. Ошибка, указанная в таких случаях:

System.TypeAccessException: Попытка прозрачным методом безопасности DynamicClass.foo(MyType,int) получить доступ к критическому типу безопасности MyType не удалась.

Другие вопросы по тегам