¿Cómo obtener el espacio de nombres de un Ensamblado?


Considere que tengo un ensamblado (dll de la biblioteca de clases) que he cargado usando el siguiente código,

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");   

Y necesito obtener el tipo de Ensamblaje. Para obtener el tipo necesito el espacio de nombres del ensamblado.

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

Cómo puedo obtener el Espacio de nombres en la línea anterior.?! como para obtener el Espacio de nombres , necesito obtener el tipo..?

Type.Namespace;

Es decir, necesito obtener el Espacio de nombres del ensamblado que se puede usar para obtener su Tipo.

Gracias en avance

Author: starblue, 2009-03-17

7 answers

Use Assembly.GetTypes () - esto te dará una colección de todos los tipos y luego puedes obtener la propiedad de Espacio de nombres para cada uno de ellos.

Entonces supongo que puedes simplemente comprobar que todos los tipos tienen el mismo valor de Espacio de nombres y usar este valor. De lo contrario, agregue alguna otra lógica para detectar qué espacio de nombres considerar primario.

 30
Author: sharptooth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-17 06:04:51

Un ensamblado puede contener varios espacios de nombres. Creo que lo que realmente quiere preguntar es cómo obtener un tipo de un ensamblado sin especificar el espacio de nombres.

No se si hay una mejor manera, pero puedes intentar buscar el tipo específico como este (add - using linq;):

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

Esto lanzará efectivamente si hay más de 1 clase con ese nombre bajo diferentes espacios de nombres (porque el método Único asegura que solo hay 1).

Para una lista de los espacios de nombres para esa clase usted puede:

Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
 19
Author: eglasius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-17 06:10:14

Actualizado:

SI la assembly name & assembly namespace son mismo en el proyecto y asegurarse de mantener el tema de la misma Y desea obtener el espacio de nombres de la actual ejecutado Asamblea entonces usted puede usar esto:

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

Y para su conjunto cargado:

var namespace = myAssembly.GetName().Name;

Pero SI el assembly name & assembly namespace no son iguales en su proyecto entonces usted puede utilizar esta manera:

// 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();
 13
Author: RAM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-24 15:33:08

Usando Mono/Xamarin, no tiene acceso a la propiedad "NameSpace". Puede usar lo siguiente en su lugar:

var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();
 1
Author: Jean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-11 10:28:22

Assembly.GetName().Name te dará el espacio de nombres predeterminado

 0
Author: Lance H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-20 13:42:57

Para tomar solo el espacio de nombres sigue el siguiente código:

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

O

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

    return nameSpace;
}
 0
Author: Tiago S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 13:03:05

Obteniendo que un ensamblado debe contener casi una clase (o cualquier otro tipo, como una interfaz) y deben estar contenidos en un espacio de nombres, que debe comenzar dentro del espacio de nombres del ensamblado, el más corto de ellos será el último.

Así que, aquí está la solución que encontré:

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

Simplemente encuentro todos los tipos dentro del ensamblado requerido y busco cuál está contenido en el espacio de nombres que tiene el nombre más corto.

 0
Author: Davide Cannizzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-18 22:40:53