Есть ли у 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 не удалась.