c#从.dll获取所有名称空间

时间:2011-06-03 15:51:25

标签: c# assemblies

在DLL(GUI)中,我需要获取当前Application中所有命名空间的List(例如,如果我将该DLL绑定到名为“Hundekuchen”的Project中,它应该列出

{ "GUI", "Hundekuchen" }

这是否有内置功能?

3 个答案:

答案 0 :(得分:11)

没有内置函数,但您可以枚举程序集中的类型,并获取它们的名称空间。

        Assembly asm = typeof(MyApplication).Assembly;
        List<string> namespaces = new List<string>();
        foreach (var type in asm.GetTypes())
        {
            string ns = type.Namespace;
            if (!namespaces.Contains(ns))
            {
                namespaces.Add(ns);
            }
        }

        foreach (var ns in namespaces)
        {
            Console.WriteLine(ns);
        }

答案 1 :(得分:6)

您可以获取AppDomain中所有程序集的列表,然后获取所有已加载程序集中的所有类,但是您必须过滤掉您不想看到的程序集,因为mscorlib中有许多程序集链接,系统库。这是一个快速而又脏的(使用.NET 3.5) - 如果你链接其他你不想看到的库,你可能需要过滤掉一些:

    var enumerable = AppDomain.CurrentDomain.GetAssemblies()
        .SelectMany(assembly => assembly.GetTypes())
        .Select(type => type.Namespace)
        .Distinct()
        .Where(name => name != null &&
                       !name.StartsWith("System") &&
                       !name.StartsWith("Microsoft") &&
                       !name.StartsWith("MS.") &&
                       !name.StartsWith("<"));

答案 2 :(得分:1)

查看System.Reflection命名空间,您可以在这里找到检索有关程序集信息的功能。

这可能不是你需要的,但它显示了你可以实现的东西,我在当前正在执行的程序集中获取所有类型,迭代它们并打印出每种类型的命名空间。

foreach (Type t in Assembly.GetExecutingAssembly().GetTypes())
{
    Console.WriteLine(t.Namespace);
}

只需检查Assembly课程,您就应该找到解决问题的方法。