7

Tengo el proyecto VS 2008 y csproj (Biblioteca C#).Cómo obtener el espacio de nombre predeterminado del proyecto csproj (VS 2008)

En las propiedades del proyecto, tiene un nombre de conjunto y un espacio de nombre predeterminado. Nota: cada clase tiene un espacio de nombre.

¿Es posible, en tiempo de ejecución, obtener el valor del espacio de nombres predeterminado?

Mi objetivo es usar los recursos, y necesito el valor de espacio de nombres por defecto:

Assembly assembly = Assembly.GetExecutingAssembly(); 

//foreach (string resourceName in assembly.GetManifestResourceNames()){} 

Stream syntaxModeStream = assembly.GetManifestResourceStream(pathToResources 
+ ".SyntaxModes.xml"); 

Actualización:

Pieter dicho que no puedo. El espacio de nombre predeterminado no se almacena en el ensamblaje

var resource = assembly.GetManifestResourceNames().Single(p => p.EndsWith(".SyntaxModes.Xml")) 

donde se almacena el espacio de nombres predeterminado?

Solo puedo leer usando Addins Visual Studio (objeto DTE) ??

Respuesta

13

No puede.

El espacio de nombre predeterminado no se almacena en ningún lugar dentro del ensamblaje. Es solo una configuración de proyecto de Visual Studio.

Lo que suelo hacer es usar el nombre del ensamblaje: Assembly.GetName().Name. El problema con esto es que solo funciona si el nombre del ensamblado no se ha modificado.

para su problema específico, puede utilizar assembly.GetManifestResourceNames() y hacer algunas pruebas sobre esos nombres, por ejemplo:

string name = assembly.GetManifestResourceNames().Single(p => p.EndsWith(".SyntaxModes.Xml")) 
+0

donde se almacena el nombre por defecto ?? ¿Solo puedo leer usando Addins Visual Studio (objeto DTE)? – Kiquenet

+0

Usted siempre tiene la opción de leer el XML .csproj usted mismo. Ahí es donde está almacenado. –

4

No es 100% seguro de que es lo que estás buscando pero se puede obtener el espacio de nombres usando:

this.GetType().Namespace 
+1

+1 - utilizó este enfoque el otro día en una clase ... –

+1

Esto no funcionará en el (raro) caso cuando el espacio de nombres raíz en el proyecto VS no es el mismo que el espacio de nombres de la clase en la que se encuentra. puede renombrar libremente el espacio de nombres raíz, rompiendo así el código. – Vlad

+1

No funcionará y en casos no tan extraños, pero puede ser difícil de diagnosticar, fácil de romper (no hay nada que obligue a que el espacio de nombre de ensamblado predeterminado sea el mismo que el de los tipos) – minsk

1

me escribió un método de extensión de la Asamblea que se encuentra a los recursos por su nombre de archivo dentro de los recursos incluidos:

public static Stream GetManifestResourceStreamByFileName(this Assembly assembly, string fileName) 
{ 
    var targetName = assembly.GetManifestResourceNames() 
     .FirstOrDefault(x => x.EndsWith("." + fileName)); 

    return targetName == null ? null : assembly.GetManifestResourceStream(targetName); 

} 

continuación, que acaba de llamar de este modo:

var assembly = Assembly.GetExecutingAssembly(); // or Assembly.GetAssembly(this.GetType()) or whatever 

    var myResource = assembly.GetManifestResourceStreamByFileName("myResource.jpg"); 
+0

** ¿dónde se almacena el espacio de nombres predeterminado? * * – Kiquenet

+0

Creo que la pregunta fue respondida anteriormente: no está almacenada en el ensamblaje. El concepto de "espacio de nombres predeterminado" es un concepto de Visual Studio que se utiliza en tiempo de compilación al nombrar recursos incrustados. El código que publiqué es lo que creo que es una solución elegante al problema de no conocer el espacio de nombres predeterminado. – esmoore68

Cuestiones relacionadas