引发验证异常的 LINQ 表达式

本文关键字:LINQ 表达式 异常 验证 | 更新日期: 2023-09-27 18:34:06

为什么这段代码会抛出"System.Security.VerificationException: 操作可能会破坏运行时的稳定性"

MethodInfo mi = typeof(TypedReference).GetMethod("InternalMakeTypedReference", BindingFlags.NonPublic | BindingFlags.Static);
ParameterExpression p1 = Expression.Parameter(typeof(IntPtr));
ParameterExpression p2 = Expression.Parameter(typeof(object));
ParameterExpression p3 = Expression.Parameter(typeof(IntPtr[]));
ParameterExpression p4 = Expression.Parameter(typeof(Type));
Expression exp = Expression.Call(mi, Expression.Convert(p1, typeof(void*)), p2, p3, Expression.Convert(p4, Types.RuntimeType));
var m = Expression.Lambda<Action<IntPtr,object,IntPtr[],Type>>(exp, p1, p2, p3, p4).Compile();
m(IntPtr.Zero,null,null,null);
由于

参数错误,不会引发异常。

引发验证异常的 LINQ 表达式

据我所知,您无法构建包含不安全代码的表达式树。不安全代码意味着无法验证类型/内存安全性,但根据此错误描述,表达式只有在代码可验证的情况下才能编译。

在表达式树中传递IntPtr应该没问题,但如果参数void*,那将无济于事。

一种可行的方法可能是使用 Reflection.Emit 直接生成方法访问 IL。默认情况下,它不能调用私有方法,但这里有一个解决这个问题的答案:https://stackoverflow.com/a/1778446/1659828

无论如何,在您的情况下,我不知道您要完成什么,但是尝试使用不符合CLS的API的实现细节似乎可能有更好的方法。