C#ソースコードファイル(単一の.CSファイルのみ、複雑なものではない)を受け取るプログラムを作成し、このプログラムでそのソースコードを分析して、その結果、必要な.NETDLLを教えてほしいとしましょう。そのソースファイルで使用されるメソッドの場合。これは技術的にも可能ですか?
したがって、たとえば、そのソースファイルにConsole.Writeline()メソッドしかない場合は、 「mscorlib.DLL」が必要であることを通知できるようにします。
これを行うには、基本的にコンパイラを作成する必要があります。必要なDLLを判別する唯一の方法は、最初に、ソースファイル内のどの識別子/名前がバインドされているかを判別することです。バインドする名前を確立すると、必要なDLLを理解できます(選択できるDLLリストがあると仮定します)。
ただし、名前バインディングを理解するには、プログラムが理解している必要があります...
要するに、あなたはコンパイラが必要です:)
次の例を考えてみましょう。
using A;
static void Main(string[] args)
{
Customer c = new Customer();
}
//AssemblyA.dll
namespace A { public class Customer { } }
//AssemblyB.dll
namespace A { public class Customer { } }
この場合、コードサンプルに必要なアセンブリを知る方法はありません。理想的には、アセンブリのリストをコードファイルと一緒に使用する必要があるため、タイプを探す場所を常に把握できます。
この問題のエラーが発生しやすい解決策は、名前空間とタイプの組み合わせに一致する最初のアセンブリを取得し、コードファイル内のすべてのクラスを探すことです。しかし、この場合でも、正しいものがあるかどうかはわかりません。
using A;
using B;
static void Main(string[] args)
{
Customer c = new Customer();
}
//AssemblyA.dll
namespace A { public class Customer { } }
//AssemblyB.dll
namespace B { public class Customer { } }
このようなコードファイルを解析するときに参照するアセンブリのリストを常に含めます。
すべてのusing
行を調べて、使用されている名前空間を判別できます。次に、リフレクションを使用して、それらの名前空間にタイプを実装するアセンブリを判別できますが、1対1の関係(または1対多)はありません。関係)名前空間とアセンブリの間の関係)、せいぜい、必要なアセンブリだけでなく、必要なアセンブリしか教えてくれません。それを行う場合でも、検討する可能性のあるすべてのアセンブリのリストが必要になるため、リフレクションを介して名前空間を分析するアセンブリを知ることができます。
CodeDOMについてはわかりませんが、C#コンパイラ(csc.exe
)は、最終的なコードを生成するときに、不要なアセンブリ参照を無視できるほど賢いです。
したがって、GACで(適切なアーキテクチャの)アセンブリを列挙し、それらをすべて追加して、コンパイラに分類させることができます。