c# - 无效的 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 会这样,出于什么原因或其他原因,请分享?
谢谢。
解决方案
推荐阅读
- r - 在 R 中整理因子结构/模式矩阵的最佳方法?
- oracle-adf - 只读表显示外键而不是详细信息
- bash - 拆分字符串时如何使用“\”?
- javascript - 如何避免 HTML javascript 字符串间距带有 (+) 符号?
- ios - 在 2019 年创作 Apple 帮助手册
- java - 创建 ChromeDriver 后可以添加代理吗?
- python - 如何从 python 脚本调用 pip 并使其在本地安装到该脚本?
- linux - 开发人员云服务和 Packer 构建失败,HTTP 401 未经授权?
- excel - 使用 Applescript 从找到的单元格中复制 excel 列
- javascript - 为什么我的电子邮件验证没有返回我设置的错误消息?