获取AppDomain中所有可用命名空间的列表

时间:2013-02-20 09:39:58

标签: c# dynamic appdomain .net-assembly

我需要在运行时“扫描”所有已加载程序集的活动AppDomain,并获取这些程序集中可用的唯一名称空间列表,.NET是否支持?

代码必须在运行时执行,以便代码是动态的。

我刚开始使用C#进行编码,所以我不确定从哪里开始,所以任何帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:4)

AppDomain开始(也许AppDomain.CurrentDomain)并致电GetAssemblies。在每个程序集上迭代它定义的types,跟踪每个程序集namespace

作为使用LINQ执行此操作的简单示例,请考虑以下事项:

var namespaces = AppDomain.CurrentDomain
                     .GetAssemblies()
                     .SelectMany(a => a.GetTypes())
                     .Select(t => t.Namespace)
                     .Distinct()
                     // optionally .OrderBy(ns => ns) here to get sorted results
                     .ToList();

答案 1 :(得分:2)

事实上,我写了一些代码,可以让你在几天前这样做。

使用此课程

    public class NSScanner
    {
        public static List<Type> GetLoadedTypes(AppDomain appDomain)
        {
            return _getLoadedTypes(appDomain);
        }

        public static List<Type> GetPublicLoadedTypes(AppDomain appDomain)
        {
            return _getLoadedTypes(appDomain, true);
        }

        public static List<string> GetUniqueNamespaces(IEnumerable<Type> types)
        {
            var uniqueNamespaces = new ConcurrentBag<string>();

            Parallel.ForEach(types, type =>
            {
                if (!uniqueNamespaces.Contains(type.Namespace) && !string.IsNullOrEmpty(type.Namespace))
                    uniqueNamespaces.Add(type.Namespace);
            });

            var sortedList = uniqueNamespaces.OrderBy(o => o).ToList();

            return sortedList;
        }


        private static List<Type> _getLoadedTypes(AppDomain appDomain, bool onlyPublicTypes = false)
        {
            var loadedAssemblies = appDomain.GetAssemblies();

            var loadedTypes = new List<Type>();

            Parallel.ForEach(loadedAssemblies, asm =>
            {
                Type[] asmTypes;
                if (onlyPublicTypes)
                    asmTypes = asm.GetExportedTypes();
                else
                    asmTypes = asm.GetTypes();

                loadedTypes.AddRange(asmTypes);
            });

            return loadedTypes;
        }
    }

<强>用法

var publicLoadedTypes = NSScanner.GetPublicLoadedTypes(AppDomain.CurrentDomain);
var namespaces = NSScanner.GetUniqueNamespaces(publicLoadedTypes);

享受!