Подтвердить что ты не робот

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

У меня есть сборка (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);             

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

Type.Namespace;

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Для списка пространств имен для этого класса вы можете:

Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();

Ответ 3

Обновлено:

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

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

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

var namespace = myAssembly.GetName().Name;

Но IF 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();

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

  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;
}

Ответ 7

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

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

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 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.
}

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