C#结合MSIL - JIT Skip Verification

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)

调用方法时发生的'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(比如当你调用一个动态方法时,你trueskipVerification参数传递给它的构造函数)?

Had*_*ais 0

无论是否启用验证,即使直接使用 CIL,也不能违反类型可访问性或成员可见性。这是 CIL 代码正确性的问题,而不仅仅是类型安全的问题。这是检查给定类型对象是否是 的实例的正确方法RuntimeType

 static bool IsTypeRuntimeType(Type type)
 {
        return typeof(object).GetType() == type.GetType();
 }
Run Code Online (Sandbox Code Playgroud)

  • @boaz23因为`DynamicMethod`提供了几个构造函数,其中最后一个参数`boolskipVisibility`使您能够跳过JIT可见性检查,正如我所说,这与跳过验证不同。静态编写或发出 IL 代码时,只能在作为完全可信代码运行时跳过验证。但是,无法静态地告诉 JIT 编译器跳过某些方法的可见性检查。只是不支持而已。 (3认同)