通常获取获取AppDomain中所有的程序集,可以使用AppDomain.CurrentDomain.GetAssemblies(),但结果中只包含使用过的程序集,未使用的程序集不会包含其中。
如何解决这个问题?我们要使用到Assembly对象的GetReferencedAssemblies()方法,这个方法可以返回该程序集引用了的程序集,不论是否已加载,都会返回。
添加以下的扩展方法即可获取AppDomain所有需要用到的程序集。
public static class Extents
{
public static List<Assembly> GetReferanceAssemblies(this AppDomain domain)
{
var list = new List<Assembly>();
domain.GetAssemblies().ForEach(i =>
{
GetReferanceAssemblies(i, list);
});
return list;
}
static void GetReferanceAssemblies(Assembly assembly, List<Assembly> list)
{
assembly.GetReferencedAssemblies().ForEach(i =>
{
var ass = Assembly.Load(i);
if (!list.Contains(ass))
{
list.Add(ass);
GetReferanceAssemblies(ass, list);
}
});
}
}