2011-01-31 20 views
6

Sto cercando di estrarre il nome del progetto utilizzando il reflection, ma durante il metodo della sottostringa mi dà "index out of bound error".Ottenere l'esecuzione del nome dell'assieme utilizzando la riflessione

string s = System.Reflection.Assembly.GetExecutingAssembly().Location;   
int idx = s.LastIndexOf(@"\"); 
s = s.Substring(idx, s.Length); 

Non capisco perché sta dando errore sulla terza riga.

Aiuto Plz.

+0

Chiarire nome del progetto. Il codice non contiene nomi di progetti. – leppie

+5

Hanno inventato i punti di rottura qualche tempo fa ... –

+1

Supponiamo che la lunghezza del percorso sia di 15 caratteri, s.La lunghezza sarà 15. La sottostringa con 2 parametri accetterà l'indice iniziale e la lunghezza, NON l'indice di arresto. Quindi, nel tuo esempio, stai cercando di ottenere 15 caratteri dall'indice di inizio, quindi ottieni l'indice fuori limite. Se si insiste a utilizzare la sottostringa, è necessario modificare il secondo parametro in s.Length-idx, altrimenti, utilizzare System.IO.Path.GetFileName come suggerito di seguito. Intendiamoci, il tuo metodo restituirà \ anche, quindi vuoi veramente idx + 1, s.Length - idx - 1 –

risposta

14

Prova:

System.IO.Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location) 
+0

sì, funziona .. Così preciso. – Karan

+5

il nome del progetto non è necessariamente uguale al nome dell'assembly. –

1

Avete il debug del codice? Sei sicuro che la seconda riga restituisca un valore diverso da -1? Se nella stringa non è presente la barra rovesciata, LastIndexOf restituirà -1, che non è un indice valido che può essere utilizzato da Substring e pertanto verrà generato un errore 'indice fuori limite'.

Un metodo più sicuro sarebbe estrarre il nome file utilizzando i metodi definiti nella classe Path. Tuttavia, si tenga presente che il "nome progetto" non è necessariamente uguale al nome dell'assembly.

1

Utilizzare la classe Path invece di provare a reinventare la ruota e calcolare gli indici di sottostringa manualmente.

1

Basta rimuovere il secondo parametro dalla chiamata a Sottostringa. Dalla documentazione:

// Exceptions: 
// System.ArgumentOutOfRangeException: 
//  startIndex plus length indicates a position not within this instance. -or- 
//  startIndex or length is less than zero. 
+0

Funziona anche :-) – Karan

0

vorrei provare ad accedere l'attributo AssemblyTitle nel file AssemblyInfo. La posizione di qualsiasi assemblea potrebbe non essere uguale al nome del progetto. Prova questo:

Assembly a = Assembly.GetEntryAssembly(); 
AssemblyTitleAttribute titleAttr = (AssemblyTitleAttribute) a.GetCustomAttributes(typeof(AssemblyTitlenAttribute), false)[0]; 
Console.WriteLine("Title: " + titleAttr.Title); 

hth

Problemi correlati