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