using System.Reflection;
public static class AppDomainExtents
{
///
/// 获取AppDomain所有程序集(先扫描exe目录,然后递归检测exe的依赖)
///
///
/// 程序集前缀
/// 如果某个dll被反射加载,同时程序被发布为自包含的单个exe程序,这种dll目前检测不到
///
public static Assembly[] GetAllAssemblies(this AppDomain domain, string prefix = "ips")
{
Dictionary dic = new Dictionary();
var exe = Assembly.GetEntryAssembly();
dic[exe.FullName] = exe;
var files = Directory.GetFiles(domain.BaseDirectory, prefix + "*.dll", SearchOption.AllDirectories);
foreach (var item in files)
{
//如果一个dll在项目中被反射加载,这种情况需要需要从目录中检索dll
var assembly = Assembly.LoadFrom(item);
dic[assembly.FullName] = assembly;
}
domain.GetAssemblies().ToList().ForEach(i =>
{
if (dic.ContainsKey(i.FullName)) return;
if (i.FullName != null && i.FullName.ToUpper().StartsWith(prefix.ToUpper()))
dic[i.FullName] = i;
GetReferanceAssemblies(i, dic, prefix);
});
var res = dic.Values.OrderBy(p => p.FullName).ToArray();
return res;
}
static void GetReferanceAssemblies(Assembly assembly, Dictionary dic, string prefix)
{
assembly.GetReferencedAssemblies().ToList().ForEach(i =>
{
if (dic.ContainsKey(i.FullName)) return;
if (i.Name == null || !i.Name.ToUpper().StartsWith(prefix.ToUpper())) return;
var ass = Assembly.Load(i);
dic[i.FullName] = ass;
GetReferanceAssemblies(ass, dic, prefix);
});
}
}