最近、Ayendeの本Building DSLs in Booを購入しました(購入して読んでください。すばらしいです)が、実装の問題が発生しているので、生成されたコードがどのようになるかを確認したいと思います。私は通常、リフレクターを使用してコードを確認しますが、この場合、アセンブリは動的であり、メモリ内にのみ存在します。動的アセンブリをディスクに保存して、それらを反映できるようにする方法はありますか?
編集/私の答え:
うわー、これに戻るのに少し時間がかかりました。残念ながら、私は元の質問から重要な部分を省きました。
重要なビット:本で推奨されているように、私はAyendeのRhinoDSLライブラリを使用しています。DslEngineのサブクラスにあるbooコンパイラにアクセスできます。これは次のようになります。
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"));
}
}
最小限の変更で必要なものを取得するには、1行追加する必要がありました...
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は、アセンブリをディスクに出力したため、メモリ内のアセンブリを見つけることができなくなりました)。したがって、これはデバッグツールとしてのみ役立ちます。