Как получить пространство имен сборки?

Предположим, у меня есть сборка (dll библиотеки классов), которую я загрузил, используя следующий код:

Assembly a = Assembly.LoadFrom(@"C:\Documents and Settings\E454935\My Documents\Visual Studio 2005\Projects\nunit_dll_hutt\for_hutt_proj\bin\Debug\asdf.dll");   

и мне нужно получить тип сборки. Чтобы получить тип, мне нужно пространство имен сборки.

Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);             

как я могу получить пространство имен в строке выше.?! как для того, чтобы получить пространство имен, мне нужно получить тип..?

Type.Namespace;

то есть мне нужно получить пространство имен сборки, которое можно использовать для получения ее типа.

заранее спасибо


person SyncMaster    schedule 17.03.2009    source источник


Ответы (7)


Используйте Assembly.GetTypes() - это даст вам коллекцию всех типов, а затем вы сможете получить свойство Namespace для каждого из них.

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

person sharptooth    schedule 17.03.2009

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

Я не знаю, есть ли лучший способ, но вы можете попробовать поискать конкретный тип следующим образом (добавить - с помощью linq;):

myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")

Это будет эффективно вызывать исключение, если существует более 1 класса с таким именем в разных пространствах имен (поскольку метод Single гарантирует, что существует только 1).

Чтобы получить список пространств имен для этого класса, вы можете:

Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
person eglasius    schedule 17.03.2009
comment
Кроме того, сборка может содержать несколько типов даже в пределах одного пространства имен. ОП должен понимать эту концепцию. - person Cerebrus; 17.03.2009
comment
Спасибо, этот ответ лучше. - person Najeeb; 18.11.2018

Обновлено:

ЕСЛИ элементы assembly name и assembly namespace одинаковы в вашем проекте и вы обязательно сохраните тему одинаковой И strong> вы хотите получить пространство имен текущей выполняемой сборки тогда вы можете использовать это:

var namespace = Assembly.GetExecutingAssembly().GetName().Name;

И для вашей загруженной сборки:

var namespace = myAssembly.GetName().Name;

Но ЕСЛИ assembly name и assembly namespace не совпадают в вашем проекте, вы можете использовать этот способ:

// Like @eglasius answer >>
// Find all namespaces in the target assembly where a class with the following name is exists:
var namespaceList=Assembly.Load("MyClassName").GetTypes().Select(t => t.Namespace).Distinct();
person RAM    schedule 06.05.2015
comment
Имя сборки — это не то же самое, что пространство имен сборки или пространство имен любого конкретного типа в этой сборке. Так что, к сожалению, этот ответ неверен. - person ErikE; 20.11.2015
comment
@ErikE, спасибо за подсказку. Я знаю, что на вопрос был дан ответ, мой ответ был второстепенным для этого случая: по умолчанию они равны, а в некоторых случаях разработчики сохраняют их одинаковыми, поэтому в этом случае мой ответ правильный. Я обновил свой ответ дополнительным ЕСЛИ. - person RAM; 21.11.2015

Assembly.GetName().Name даст вам пространство имен по умолчанию

person Lance H    schedule 29.10.2014
comment
Разве это не определяемые пользователем метаданные? Тогда это могло быть что угодно. - person Ray; 22.11.2014
comment
Нет, это имя файла. Это не должно иметь ничего общего с пространством имен. - person Mark A. Donohoe; 16.04.2015
comment
это имя файла. Это не должно иметь ничего общего с пространством имен - person Gianpiero; 29.04.2018

Используя Mono/Xamarin, у вас нет доступа к свойству NameSpace. Вместо этого вы можете использовать следующее:

var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();
person Jean    schedule 11.12.2016

Чтобы взять только пространство имен, выполните приведенный ниже код:

  var assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the assembly object
  var nameSpace = assembly.GetType().Namespace;//Get the namespace

ИЛИ

public string GetNamespace(object obj)
{
    var nameSpace = obj.GetType().Namespace;//Get the namespace

    return nameSpace;
}
person Tiago S    schedule 13.04.2016
comment
Этот ответ явно неверен. assembly.GetType() возвращает объект System.Reflection.RuntimeAssembly, а пространство имен для этого класса, очевидно, всегда System.Reflection. - person Bitterblue; 12.01.2017
comment
@Bitterblue В какой-то момент мне помог первый код, но я не помню, что это было за приложение. Как только я найду, где я использовал код, я добавлю больше деталей. - person Tiago S; 12.01.2017

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

Итак, вот решение, которое я нашел:

public string GetAssemblyNamespace(Assembly asm)
{
    string ns = @"";
    foreach (Type tp in asm.Modules.First().GetTypes()) //Iterate all types within the specified assembly.
        if (ns.Length == 0 ? true : tp.Namespace.Length < ns.Length) //Check whether that's the shortest so far.
            ns = tp.Namespace; //If it's, set it to the variable.
    return ns; //Now it is the namespace of the assembly.
}

Я просто нахожу все типы в требуемой сборке и ищу те, которые содержатся в пространстве имен с самым коротким именем.

person Davide Cannizzo    schedule 18.07.2017