gpt4 book ai didi

C#结合MSIL——JIT跳过验证

转载 作者:太空狗 更新时间:2023-10-29 22:00:16 26 4
gpt4 key购买 nike

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

但是,在尝试执行该行时会出现此异常:

isinst [mscorlib]System.RuntimeType

'TypeAccessException' that is occured when calling the method

是的,我知道 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();
}

关于C#结合MSIL——JIT跳过验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36873974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com