【发布时间】:2012-09-14 22:54:56
【问题描述】:
在为自己的语言制作编译器的过程中,我尝试使用 Reflection.Emit 框架生成一些 MSIL 代码。当我声明局部变量时使用int 时效果很好。但是,当我想声明一个尚未编译的类型的局部变量时,我遇到了麻烦,因为DeclareLocal() 将Type 作为参数。那是我未编译的类,比如A,仍然需要使用
assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemName, AssemblyBuilderAccess.RunAndSave);
module = assemblyBuilder.DefineDynamicModule(Filename);
module.DefineType(name, TypeAttributes.Public | TypeAttributes.Class)
那么我将如何编译以下程序
class A {
void M() { B b = new B(); }
}
class B
void M() { A a = new A(); }
}
【问题讨论】:
-
@phoog:他还不如等人来做他的工作,然后..
-
我实际上并没有在这里做 C#.. 这只是循环依赖的一个例子
-
语言通常要求在使用之前知道声明。 Pascal 和 C++ 就是很好的例子。如果你不想要这个限制,那么你需要创建一个多通道编译器。
-
@Hans 我不确定使用 Reflection.Emit 框架如何实现这一点。我需要生成一个类,以便在进行调用和分配时可以引用它的 TYPE。但是对于上述循环定义,这两个类中的任何一个都不会在另一个之前完全构造。
-
您可以通过在遇到类型但尚未发出该类型时生成代码来修复它。您最终可能会嵌套好几层。
标签: c# compiler-construction cil reflection.emit