假设我想编写一个程序,它接受一个C#源代码文件(只有一个.CS文件,而不是任何复杂的东西),我希望这个程序分析该源代码,结果告诉我什么是.NET DLLs我需要该源文件中使用的方法。这在技术上是否可行?
因此,例如,如果在该源文件中只有 Console.Writeline()方法,我希望它能够告诉我“mscorlib.DLL”需要。
答案 0 :(得分:4)
为了做到这一点,你基本上需要编写一个编译器。确定所需DLL的唯一方法是首先确定源文件中绑定的标识符/名称。一旦你确定了绑定的名称,你就可以理解需要什么DLL(假设有一个DLL列表可供选择)。
了解名称绑定虽然需要程序理解......
简而言之,你需要一个编译器:)
答案 1 :(得分:4)
考虑以下示例:
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 { } }
在解析像这样的代码文件时,我总是会包含要引用的程序集列表。
答案 2 :(得分:3)
您可以查看所有using
行以确定使用哪些命名空间,然后您可以使用反射来确定哪些程序集在这些命名空间中实现类型,但没有一对一的关系(命名空间和程序集之间甚至是一对多的关系,所以最好只能告诉你可能需要哪些程序集,而不仅仅是你需要的程序集。即使这样做,您也需要一个可能需要考虑的每个可能程序集的列表,这样您就可以知道通过反射分析名称空间的那些程序集。
答案 3 :(得分:2)
我不了解CodeDOM,但C#编译器(csc.exe
)非常聪明,可以在生成最终代码时忽略不需要的程序集引用。
因此,您可以在GAC中枚举(正确的架构,请!)的程序集,添加所有这些程序集,然后让编译器对其进行排序。