- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在生成(使用 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/
我遇到的问题不是紧急情况,但我不知道该怎么做。我有两个 aspx 网络表单页面。每个都有一个下拉列表。两者都由来自 sql server 的相同数据源填充。问题是,如果我在第 1 页选择一个值,然后转
我正在使用 OpenvSwitch-2.5.2 在两个虚拟机上设置第 2 层网络,如上图所示。 在阅读了 ovs 官方教程和其他一些文章后,我在每个虚拟机上尝试了以下命令: # on vm1 ip l
我是一名优秀的程序员,十分优秀!