小编boa*_*z23的帖子

C#结合MSIL - JIT Skip Verification

我正在尝试调用以下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)

调用方法时发生的'TypeAccessException'

是的,我知道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参数传递给它的构造函数)?

c# jit cil private-members member-access

6
推荐指数
1
解决办法
368
查看次数

标签 统计

c# ×1

cil ×1

jit ×1

member-access ×1

private-members ×1