gpt4 book ai didi

c# - 两个 Types Builder 互相调用是非法的?

转载 作者:行者123 更新时间:2023-11-30 12:37:21 24 4
gpt4 key购买 nike

我正在生成(使用 System.Reflection.Emit)两种类型:称它们为 foo、bar。问题是,foo 实例化并调用 bar,而 bar 使用 foo。

当我创建 bar 时一切正常,但是当我开始生成 foo 时,我得到 typeloadexception 说找不到类型 foo。当我尝试将构造函数定位到 bar 时,它发生了(可能是因为错误是模糊的),它的参数之一是 foo。

这在 bar 是 foo 中的嵌套类型时有效。

所以我的问题是 - 让两种类型像这样互相调用是非法的,还是我做错了?

最佳答案

尝试手动定位构造函数可能很困难,但您应该仍然拥有之前生成的构造函数?您是否尝试过通过它?我会尝试做一个例子...

    var assemblyName = new AssemblyName("tmp");
var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
var module = assembly.DefineDynamicModule("tmp");
var foo = module.DefineType("Foo");
var bar = module.DefineType("Bar");
var barOnFoo = foo.DefineField("bar", bar, FieldAttributes.Private);
var fooOnBar = bar.DefineField("foo", foo, FieldAttributes.Private);
var barCtor = bar.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, new Type[] { foo });
var il = barCtor.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Stfld, fooOnBar);
il.Emit(OpCodes.Ret);
var fooCtor = foo.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, Type.EmptyTypes);
il = fooCtor.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Newobj, barCtor);
il.Emit(OpCodes.Stfld, barOnFoo);
il.Emit(OpCodes.Ret);

// create the actual types and test object creation
Type fooType = foo.CreateType(), barType = bar.CreateType();
object obj = Activator.CreateInstance(fooType);

我可以添加额外的代码来检查结果,但在调试器中查看 obj 会更容易,您可以看到字段等。

对于更复杂的情况 - 不要忘记您不需要编写方法(IL)的主体来使用它......您可以先编写所有签名( DefineMethod, DefineConstructor, etc), 然后在后面写所有的主体,允许完全循环的代码。

关于c# - 两个 Types Builder 互相调用是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1281433/

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