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键推送到堆栈上,然后调用字典的索引器来获取对象。