gpt4 book ai didi

c# - 使用 Reflection.Emit 发射对象数组时出现问题

转载 作者:行者123 更新时间:2023-11-30 16:34:14 27 4
gpt4 key购买 nike

我正在尝试发出我认为是一个简单的对象数组,它会产生类似于以下示例的代码

object[] parameters = new object[] { a, b, };

当我使用 VS 在 C# 中编写上述代码时,我得到以下 IL。正如预期的那样有效。

.locals init (
[0] object[] parameters,
[1] object[] CS$0$0000)

但是,当我尝试直接发出 IL 时,我只得到一个索引初始化数组。有人可以帮我告诉我哪里出了问题吗?

这是我正在使用的 Emit 代码:

int arraySize = 2;
LocalBuilder paramValues = ilGenerator.DeclareLocal(typeof(object[]));
paramValues.SetLocalSymInfo("parameters");
ilGenerator.Emit(OpCodes.Ldc_I4_S, arraySize);
ilGenerator.Emit(OpCodes.Newarr, typeof(object));
ilGenerator.Emit(OpCodes.Stloc, paramValues);

这是生成的 IL:

.locals init (
[0] object[] objArray)

这两种解决方案产生的 IL 的其余部分是相同的,但由于某些原因,.locals init 不同。

最佳答案

C# 编译器生成如下代码:

object[] temp = new object[2];
temp[0] = (object)a;
temp[1] = (object)b;
parameters = temp;

临时变量是您看到的 CS$0$0000。我认为这样做是为了确保在初始化数组时可能引发的异常不会在“参数”中留下部分初始化的数组。当代码捕获异常时,这可能会导致意外失败。如所写,命名变量为 null 或完全初始化。好主意。

关于c# - 使用 Reflection.Emit 发射对象数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2574271/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com