首页 > 解决方案 > 无效的 IL 代码在 .NET Core 3.1 中成功运行,但在 .NET Framework 4.8 中失败

问题描述

我正在做一个......嗯,让我们说一个实验。我有一个标记接口(它没有任何东西,它只是用于依赖注入)。我在代码中的某处解析了一个具有此标记接口的服务,并通过反射搜索其中的特定方法 - 它必须被调用Execute并返回一个Task. 如果我找到这样的方法,我会创建一个DynamicMethod并发出获取该方法所需的指令。
这是一个简化的代码,它只需要一个带有这个签名的方法:

Task Execute(CancellationToken token)

执行这种方法的代码是:

var dm = new DynamicMethod("SomeDynamicMethod", typeof(Task), new[] { typeof(IExecutable), typeof(CancellationToken) });

var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);

var method = typeof(Foo).GetMethod("Execute", new[] { typeof(CancellationToken) });
il.Emit(OpCodes.Callvirt, method);

il.Emit(OpCodes.Ret);

var executeDelegate = (Func<IExecutable, CancellationToken, Task>)dm.CreateDelegate(typeof(Func<IExecutable, CancellationToken, Task>));

现在它在.NET Core 3.1下成功运行,我使用Console App进行测试。
但是,当我尝试在控制台应用程序中再次在 .NET Framework 4.8 下运行它时,调用executeDelegate(示例中未显示)的代码会引发异常:

System.Security.VerificationException:操作可能会破坏运行时的稳定性。

现在问题有点明显 -IExecutable标记接口没有这样的方法并且该方法接受IExecutable作为参数,因此在加载目标后修复它castclass应该发出一条指令,但这在没有强制转换的 .NET Core 3.1 下运行良好.

因此,如果有人知道为什么 .NET Core 会这样,出于什么原因或其他原因,请分享?

谢谢。

标签: c#.net-corecilreflection.emit.net-framework-version

解决方案


推荐阅读