从尝试内部返回一个值,并使用 ILGenerator 捕获



我目前正在尝试生成一个方法,该方法将在try块内返回结果。等效的 C# 代码如下所示:

public int Foo()
{
try
{
return 1;
}
catch(Exception ex)
{
Console.WriteLine(ex);
return -1;
}
}

而且我知道,这显然永远不会引发错误,但是这只是我正在尝试做的事情的缩短,我可以将问题归结为尝试/捕获。

这是我到目前为止得到的:

var method = new DynamicMethod("Foo", typeof(int), null);
var methodIL = method.GetILGenerator();
var exBlock = methodIL.BeginExceptionBlock();
methodIL.Emit(OpCodes.Ldc_I4_1);
methodIL.Emit(OpCodes.Stloc_0);
methodIL.Emit(OpCodes.Leave_S, exBlock);
methodIL.BeginCatchBlock(typeof(Exception));
methodIL.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new[] { typeof(string) }));
methodIL.Emit(OpCodes.Ldc_I4_M1);
methodIL.Emit(OpCodes.Stloc_0);
methodIL.Emit(OpCodes.Leave_S, exBlock);
methodIL.EndExceptionBlock();
methodIL.Emit(OpCodes.Ldloc_0);
methodIL.Emit(OpCodes.Ret);
var foo = (Func<int>)method.CreateDelegate(typeof(Func<int>));
Console.WriteLine(foo.Invoke());

我或多或少直接从 sharplab.io 那里拿走了 IL。

但是,此方法会向我抛出异常:

System.InvalidProgramException:"公共语言运行库检测到无效程序。

据我所知,这表明我不知何故搞砸了 IL。

你必须调用 IlGenerator.DeclareLocal(( 方法来声明你将要使用的局部变量OpCodes.Ldloc_0OpCodes.Stloc_0

只需添加:methodIL.DeclareLocal(typeof(int));

相关内容

  • 没有找到相关文章

最新更新