boa*_*z23 6 c# jit cil private-members member-access
我正在尝试调用以下MSIL方法:
.method public hidebysig static bool IsRuntimeType(class [mscorlib]System.Type 'type') cil managed {
.maxstack 2
ldarg.0
isinst [mscorlib]System.RuntimeType
ldnull
cgt.un
ret
} // end of method Program::IsRuntimeType
Run Code Online (Sandbox Code Playgroud)
但是,尝试执行该行时会发生此异常:
isinst [mscorlib]System.RuntimeType
Run Code Online (Sandbox Code Playgroud)
是的,我知道JIT验证,但我试过很多东西,他们没有工作或也许我只是做了他们是错的,我"不能确定.另外,我找不到太多关于这个主题.
我尝试了以下(将它们中的一些组合在一起):
[SecurityPermissionAttribute(SecurityAction.Demand, SkipVerification = true)]向方法添加属性(也包含SecurityAction.Assert)new ReflectionPermission(ReflectionPermissionFlag.MemberAccess | ReflectionPermissionFlag.RestrictedMemberAccess).Demand();(还有.Assert())new SecurityPermission(SecurityPermissionFlag.AllFlags).Demand();(还有.Assert())这些要求和主张都没有抛出异常.
澄清一下,这只是一个例子.主要思想是使代码工作并绕过JIT的验证.这种特殊的方法无法在没有反射的C#中完成,我想避免它,因为它非常昂贵,但这不是重点.
有没有什么办法可以让这个代码在没有JIT抛出的情况下执行TypeAccessException(比如当你调用一个动态方法时,你true将skipVerification参数传递给它的构造函数)?
无论是否启用验证,即使直接使用 CIL,也不能违反类型可访问性或成员可见性。这是 CIL 代码正确性的问题,而不仅仅是类型安全的问题。这是检查给定类型对象是否是 的实例的正确方法RuntimeType。
static bool IsTypeRuntimeType(Type type)
{
return typeof(object).GetType() == type.GetType();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
368 次 |
| 最近记录: |