C# 无效的IL代码在.NET Core 3.1中成功运行,但在.NET Framework 4.8中失败
我正在做。。。嗯,让我们说一个实验。我有一个标记接口(它没有任何内容,只是用于依赖注入)。我在代码中的某个地方解析了一个具有此标记接口的服务,并通过反射搜索其中的特定方法-必须调用C# 无效的IL代码在.NET Core 3.1中成功运行,但在.NET Framework 4.8中失败,c#,.net-core,cil,reflection.emit,.net-framework-version,C#,.net Core,Cil,Reflection.emit,.net Framework Version,我正在做。。。嗯,让我们说一个实验。我有一个标记接口(它没有任何内容,只是用于依赖注入)。我在代码中的某个地方解析了一个具有此标记接口的服务,并通过反射搜索其中的特定方法-必须调用Execute并返回Task。如果我找到这样一个方法,我会创建一个DynamicMethod,并发出获取该方法所需的指令。 下面是一个简化的代码,它只需要一个具有此签名的方法: 任务执行(取消令牌) 执行该方法的代码为: var dm=newdynamicmethod(“SomeDynamicMethod”,type
Execute
并返回Task
。如果我找到这样一个方法,我会创建一个DynamicMethod
,并发出获取该方法所需的指令。下面是一个简化的代码,它只需要一个具有此签名的方法:
任务执行(取消令牌)
执行该方法的代码为:
var dm=newdynamicmethod(“SomeDynamicMethod”,typeof(Task),new[]{typeof(IExecutable),typeof(CancellationToken)});
var il=dm.GetILGenerator();
il.Emit(操作码.Ldarg_0);
il.Emit(操作码Ldarg_1);
var method=typeof(Foo).GetMethod(“Execute”,new[]{typeof(CancellationToken)});
发射(操作码.Callvirt,方法);
发射(操作码Ret);
var executeelegate=(Func)dm.CreateDelegate(typeof(Func));
现在它在.NET Core 3.1下成功运行,我使用控制台应用程序进行测试。但是,当我在Console应用程序中再次尝试在.NET Framework 4.8下运行它时,调用
ExecuteElegate
(示例中未显示)的代码引发异常:
System.Security.VerificationException:操作可能会使运行时不稳定
现在问题有点明显-IExecutable
标记接口没有这样的方法,该方法接受IExecutable
作为参数,因此加载目标后要修复它,应该发出一条castclass
指令,
但在.NETCore3.1下运行良好,无需强制转换
所以,如果有人知道.NETCore为什么会这样,有什么原因或其他什么,请分享
谢谢。如果您给它的不是
Foo
的实例,会发生什么?