假设我想编写一个程序,它需要一个 C# 源代码文件(只有一个 .CS 文件,并不复杂),我希望这个程序分析该源代码,结果告诉我我需要哪些 .NET DLL对于该源文件中使用的方法。这在技术上是否可行?
因此,例如,如果在该源文件中只有一个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
行以确定使用了哪些命名空间,然后您可以使用反射来确定哪些程序集实现了这些命名空间中的类型,但没有一对一的关系(甚至没有一对多的关系)命名空间和程序集之间的关系),因此,它充其量只能告诉您可能需要哪些程序集,而不仅仅是您肯定需要的程序集。即使要做到这一点,您也需要一个您可能想要考虑的每个可能程序集的列表,以便您知道要通过反射分析哪些程序集以查找名称空间。
I don't know about CodeDOM, but the C# compiler (csc.exe
) is smart enough to ignore assembly references that aren't needed, when it generates the final code.
So you can just enumerate assemblies (of the right architecture, please!) in the GAC, add all of them, and let the compiler sort it out.