Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无效的IL代码在.NET Core 3.1中成功运行,但在.NET Framework 4.8中失败_C#_.net Core_Cil_Reflection.emit_.net Framework Version - Fatal编程技术网

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
的实例,会发生什么?