CodeDOM と Reflection.Emit に関する重要なポイントは次のとおりだと思います。
CodeDomは C# ソース コードを生成し、通常、ソリューションの一部として含めて IDE でコンパイルするコードを生成するときに使用されます (たとえば、LINQ to SQL クラス、WSDL、XSD はすべてこの方法で動作します)。このシナリオでは、部分クラスを使用して、生成されたコードをカスタマイズすることもできます。C# ソースを生成し、コンパイラを実行してそれを解析し (再び!)、コンパイルするため、効率が低下します。ループなどの比較的高レベルの構造 (C# の式やステートメントと同様) を使用してコードを生成できます。
Reflection.Emitは IL を生成するため、メモリにのみ格納できるアセンブリを直接生成します。その結果、はるかに効率的になります。低レベルの IL コードを生成する必要があるため (値はスタックに格納されます。ジャンプを使用してループを実装する必要があります)、より複雑なロジックを生成するのは少し困難です。
一般に、Reflection.Emit は通常、実行時にコードを生成するための推奨される方法と見なされますが、コンパイル時にコードを生成する場合は CodeDOM が推奨されます。あなたのシナリオでは、おそらく両方とも正常に動作します (ただし、CodeDOM は、.NET インストールの一部である C# コンパイラを実際に呼び出す必要があるため、より高い特権が必要になる場合があります)。
別のオプションは、Expression
クラスを使用することです。.NET 4.0 では、C# の式とステートメントに相当するコードを生成できます。ただし、クラスを生成することはできません。したがって、これを Reflection.Emit と組み合わせることができる場合があります (を使用して生成されたコードに実装を委譲するクラスを生成するためExpression
)。一部のシナリオでは、完全なクラス階層が実際には必要ない場合もあります。多くの場合、動的に生成されたデリゲートの辞書でDictionary<string, Action>
十分です (ただし、もちろん、正確なシナリオによって異なります)。