c # получение ВСЕХ пространств имен из .dll - PullRequest
3 голосов
/ 03 июня 2011

В DLL (GUI) мне нужно получить список всех пространств имен в текущем приложении (так, например, если бы я связал эту DLL в проект с именем "Hundekuchen", он должен список

{ "GUI", "Hundekuchen" }

Есть ли для этого встроенная функция?

Ответы [ 3 ]

11 голосов
/ 03 июня 2011

Нет встроенной функции, но вы можете перечислять типы в сборке и получать их пространства имен.

        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);
        }
6 голосов
/ 03 июня 2011

Вы можете получить список всех сборок в 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("<"));
1 голос
/ 03 июня 2011

Загляните в пространство имен System.Reflection, здесь вы найдете функции для получения информации о сборках.

Возможно, это не совсем то, что вам нужно, но оно показывает, чего вы можете достичь, я получаю все типы в текущей выполняемой сборке, повторяю их и распечатываю пространство имен каждого типа.

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

Просто проверьте класс Assembly, и вы должны найти способ решить свою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...