我正在尝试调用以下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参数传递给它的构造函数)?