Недавно я купил книгу Айенде Building DSLs in Boo (купите ее, прочитайте, она потрясающая), но я Я столкнулся с проблемой реализации и хочу посмотреть, как выглядит сгенерированный код. Обычно я бы использовал рефлектор для просмотра кода, но в этом случае сборки динамические и только в памяти. Есть ли способ сохранить динамические сборки на диск, чтобы я мог их отразить?
ИЗМЕНИТЬ / Мой ответ:
Вау, потребовалось некоторое время, чтобы вернуться к этому. К сожалению, я упустил важный момент из первоначального вопроса.
Важный момент: я использую библиотеку RhinoDSL Айенде, как он рекомендует в книге. У меня есть доступ к компилятору boo в моем подклассе 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 больше не мог найти сборки в памяти, потому что я вывел их на диск), поэтому это полезно только как инструмент отладки.