123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- using System.Reflection;
- public static class AppDomainExtents
- {
- /// <summary>
- /// 获取AppDomain所有程序集(先扫描exe目录,然后递归检测exe的依赖)
- /// </summary>
- /// <param name="domain"></param>
- /// <param name="prefix">程序集前缀</param>
- /// <remarks>如果某个dll被反射加载,同时程序被发布为自包含的单个exe程序,这种dll目前检测不到</remarks>
- /// <returns></returns>
- public static Assembly[] GetAllAssemblies(this AppDomain domain, string dllKey = "DW5S")
- {
- Dictionary<string, Assembly> dic = new Dictionary<string, Assembly>();
- var exe = Assembly.GetEntryAssembly();
- dic[exe.FullName] = exe;
- var files = Directory.GetFiles(domain.BaseDirectory, "*" + dllKey + "*.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().Contains(dllKey.ToUpper()))
- dic[i.FullName] = i;
- GetReferanceAssemblies(i, dic, dllKey);
- });
- var res = dic.Values.OrderBy(p => p.FullName).ToArray();
- return res;
- }
- static void GetReferanceAssemblies(Assembly assembly, Dictionary<string, Assembly> dic, string dllKey)
- {
- assembly.GetReferencedAssemblies().ToList().ForEach(i =>
- {
- if (dic.ContainsKey(i.FullName)) return;
- if (i.Name == null || !i.Name.ToUpper().Contains(dllKey.ToUpper())) return;
- var ass = Assembly.Load(i);
- dic[i.FullName] = ass;
- GetReferanceAssemblies(ass, dic, dllKey);
- });
- }
- }
|