我最近买Ayende的书Building DSLs in Boo(买它,阅读它,它的真棒),但我来面对实施方面的问题,我想看到生成的代码是什么样子。我通常会使用反射器来查看代码,但在这种情况下,程序集是动态的,只能在内存中使用。有没有办法将动态程序集保存到磁盘,以便我可以反映它们?是否可以将动态程序集保存到磁盘?
编辑/我的回答:
哇,这了一段时间回来这一个。不幸的是,我留下了一些重要的问题。
重要的一点:我使用Ayende's RhinoDSL library,他在书中建议。我有机会获得嘘编译器在我DslEngine的子类,如下所示:
public class JobEngine : DslEngine
{
protected override void CustomizeCompiler(Boo.Lang.Compiler.BooCompiler compiler, Boo.Lang.Compiler.CompilerPipeline pipeline, string[] urls)
{
pipeline.Insert(1, new ImplicitBaseClassCompilerStep(typeof (JobBase), "Prepare", "JobLanguage", "log4net", "Quartz"));
}
}
要改变最少,得到我想要的东西,我需要添加一行...
public class JobEngine : DslEngine
{
protected override void CustomizeCompiler(Boo.Lang.Compiler.BooCompiler compiler, Boo.Lang.Compiler.CompilerPipeline pipeline, string[] urls)
{
compiler.Parameters.GenerateInMemory = false; // <--- This one.
pipeline.Insert(1, new ImplicitBaseClassCompilerStep(typeof (JobBase), "Prepare", "JobLanguage", "log4net", "Quartz"));
}
}
这导致编译器将程序集输出到我的〜\ LocalSettings \ Temp目录,然后我可以反映出来。需要注意的是,做出这样的改变会导致程序的其他部分中断(RhinoDSL无法再在内存中找到程序集,因为我将它们输出到磁盘),所以这只作为调试工具很有用。
使用对象的XML序列化改变?!。 – serhio 2010-01-13 16:29:03
您是否通过CodeDom创建该组件? – 2010-01-13 16:30:46