我最近買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