7

Ho VS 2008 e progetto csproj (Libreria C#).Come ottenere lo spazio dei nomi predefinito del progetto csproj (VS 2008)

Nelle proprietà del progetto, ha un nome assembly e uno spazio dei nomi predefinito. Nota: ogni classe ha uno spazio dei nomi.

E 'possibile, in runtime, ottenere il valore dello spazio dei nomi predefinito ??

mio obiettivo è utilizzare le risorse, e ho bisogno il valore di spazio dei nomi predefinito:

Assembly assembly = Assembly.GetExecutingAssembly(); 

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

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

Aggiornamento:

Pieter detto che non posso. Spazio dei nomi predefinito non memorizzato nell'assembly

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

dove è memorizzato lo spazio dei nomi predefinito ??

Solo posso leggere utilizzando Addins Visual Studio (oggetto DTE) ??

risposta

13

Non è possibile.

Lo spazio dei nomi predefinito non è memorizzato in nessun punto all'interno dell'assieme. È solo un'impostazione di progetto di Visual Studio.

Quello che tendono a fare è utilizzare il nome dell'assieme: Assembly.GetName().Name. Il problema con questo è che funziona solo se il nome dell'assembly non è stato modificato.

Per il vostro problema specifico, è possibile utilizzare assembly.GetManifestResourceNames() e fare qualche test su quei nomi, ad esempio:

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

in cui è memorizzato il namespace di default ?? Posso leggere solo usando Addins Visual Studio (oggetto DTE) ?? – Kiquenet

+0

Hai sempre la possibilità di leggere da solo l'XML di .csproj. È lì che è memorizzato. –

4

non al 100% sicuro che è quello che stai cercando, ma è possibile ottenere lo spazio dei nomi utilizzando:

this.GetType().Namespace 
+1

+1: utilizzato questo approccio l'altro giorno in una classe. –

+1

Questo non funzionerà nel (raro) caso in cui lo spazio dei nomi di root nel progetto VS non è lo stesso dello spazio dei nomi della classe in cui ci si trova. può liberamente rinominare il namespace di root rompendo così il codice. – Vlad

+1

Non funzionerà e in casi non rari ma potrebbe essere difficile da diagnosticare, facile da interrompere (non c'è nulla che imponga che lo spazio dei nomi di assembly predefinito sia lo stesso dei tipi in esso contenuti) – minsk

1

ho scritto un metodo di estensione per l'Assemblea che appena trova la risorsa per il suo nome nei limiti delle risorse inclusi:

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

} 
.210

poi basta chiamare in questo modo:

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

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

** dove è archiviato lo spazio dei nomi predefinito? * * – Kiquenet

+0

Penso che la domanda abbia avuto risposta sopra: non è memorizzata nell'assemblea. Il concetto di "namespace predefinito" è un concetto di Visual Studio che viene utilizzato in fase di compilazione quando si assegnano le risorse incorporate. Il codice che ho postato è proprio quello che ritengo essere una soluzione elegante al problema di non conoscere lo spazio dei nomi predefinito. – esmoore68