Obtenga todos los espacios de nombres de los proyectos a los que se hace referencia en una aplicación de consola

Tengo una aplicación de consola y agregué una referencia a 2 proyectos a esta aplicación de consola, CustomerService.DataAccess y CustomerService.Business, ahora, cuando se ejecuta la aplicación de consola, me gustaría obtener todos los espacios de nombres que están en los 2 proyectos que agregué la aplicación de consola. Thankx.

preguntado el 08 de enero de 11 a las 18:01

1 Respuestas

Para hacer esto, primero debe obtener los ensamblados referenciados y luego obtener el conjunto de espacios de nombres de todos los tipos en ese ensamblado.

AssemblyName[] referencedAssemblies = GetType().Assembly.GetReferencedAssemblies();
HashSet<string > namespaces = new HashSet<string>();

foreach (AssemblyName referencedAssembly in referencedAssemblies)
{
    Assembly reference = Assembly.Load(referencedAssembly);

    if (!reference.GlobalAssemblyCache)
    {
        HashSet<string> refernceNamespaces = new HashSet<string>(
            reference.GetTypes().Select(t => t.Namespace).Where(ns => ns != null));
        namespaces.UnionWith(refernceNamespaces);
    }
}

El código anterior obtendrá todos los espacios de nombres en ensamblados referenciados que no están en el GAC. Si solo desea obtener los espacios de nombres en sus ensamblajes específicos, simplemente puede verificar el AssemblyName.Name propiedad para asegurarse de que está inspeccionando los ensamblajes correctos.

Respondido el 08 de enero de 11 a las 21:01

No necesita volver a cargar los ensamblados; puede obtener la instancia de ensamblaje real a través de AppDomain.CurrentDomain.GetAssemblies () - caja de cebra

¿Quiso decir Excecutingassembly por GetType () en esa primera línea de código? - user282807

@zebrabox de hecho podrías, pero llamando Assembly.Load en un ensamblaje ya cargado no carga otra copia del mismo, solo devuelve el ensamblaje ya cargado. Como se hace referencia al ensamblaje de todos modos, no habrá gastos generales adicionales. - adrianbanks

@user282807 GetType() obtendrá el tipo de objeto actual, que en su aplicación de consola será el tipo donde vive el código anterior. Podrías usar Assembly.GetExecutingAssembly() en lugar de GetType().Assembly si tu prefieres. - adrianbanks

@adrianbanks - Ah, no sabía que LoadAssembly hizo eso - aprender algo nuevo todos los días, etc. :) - caja de cebra

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.