Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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发射器加载变量类型对象_C#_Cil - Fatal编程技术网

C#IL发射器加载变量类型对象

C#IL发射器加载变量类型对象,c#,cil,C#,Cil,所以我有类似的东西 public void test(string name, Func<object> fuc) { object x = fuc(); FieldInfo fdt = Dest.GetField(nameDest, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); ilGenerator.Emit(

所以我有类似的东西

public void test(string name, Func<object> fuc)
    {
        object x = fuc();
        FieldInfo fdt = Dest.GetField(nameDest, BindingFlags.NonPublic | 
        BindingFlags.Public | BindingFlags.Instance);

        ilGenerator.Emit(OpCodes.Ldarg_0);
        ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder);

        //and here i want to load the x

        ilGenerator.Emit(OpCodes.Stfld, fdt);
    }
公共无效测试(字符串名称,Func fuc)
{
对象x=fuc();
FieldInfo fdt=Dest.GetField(nameDest,BindingFlags.NonPublic)
BindingFlags.Public | BindingFlags.Instance);
ilGenerator.Emit(操作码.Ldarg_0);
ilGenerator.Emit(操作码.Ldfld,fieldBuilder);
//这里我要加载x
ilGenerator.Emit(opcode.Stfld,fdt);
}

有人能帮我吗?谢谢你

不行。根据调用生成的IL的方式和时间,对象可能无法访问(例如,您可以将IL保存到程序集,并从单独的进程中使用它)

您需要的是一些可以还原对象的代码。如果IL仅在当前进程/应用程序域中使用,则可以通过将对象保存到字段(可能是
静态
字段)然后加载该字段来实现


另一种选择是使用某种序列化来保存对象,然后在IL中对其进行反序列化,假设对象可以序列化。

为什么会有这样的事情?为什么会有否决票?这是一个常见的问题,虽然肯定是重复的,但也有标志。有什么原因不在运行时调用fuc()吗?此外,静态字段可以是字典,键可以是用作对象ID的无锁递增整数,值可以是您需要的对象。这是因为int可以在源代码中硬编码,而不是整个对象。因此,您只需在编译时将int键推送到堆栈上,然后调用字典的索引器来获取对象。