2011-01-31 35 views
6

Estoy tratando de extraer el nombre del proyecto utilizando la reflexión, pero durante el método de la subcadena me da "índice fuera de error encuadernado".Obtener la ejecución del nombre del ensamblado usando la reflexión

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

No entiendo por qué se está dando error en la tercera línea.

Plz Ayuda.

+0

Aclarar nombre del proyecto. El código no contiene nombres de proyectos. – leppie

+5

Han inventado puntos de interrupción hace un tiempo ... –

+1

Digamos que la longitud de su ruta es de 15 caracteres, la longitud será 15. La subcadena con 2 parámetros aceptará el índice inicial y la longitud, NO el índice de detención. Entonces, en su ejemplo, está tratando de obtener 15 caracteres del índice de inicio, por lo tanto, obtiene el índice fuera de límite. Si insistes en usar Substring, necesitas cambiar el segundo parametro en lugar de "idx" en su lugar, de lo contrario, usa System.IO.Path.GetFileName como se sugiere a continuación. Eso sí, tu método devolverá el \ también, entonces realmente quieres idx + 1, s.Length - idx - 1 –

Respuesta

14

Probar:

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

sí, funciona ... Muy preciso. – Karan

+5

el nombre del proyecto no es necesariamente el mismo que el nombre del ensamblado. –

1

¿Ha depurado el código? ¿Estás seguro de que la segunda línea devuelve un valor distinto de -1? Cuando no se encuentra una barra diagonal inversa en la cadena, LastIndexOf devolverá -1, que no es un índice válido que pueda ser usado por Substring y, por lo tanto, se lanzará un error de 'índice fuera de límites'.

Un método más seguro sería extraer el nombre de archivo utilizando los métodos que se definen en la clase Path. Pero tenga en cuenta que el 'nombre del proyecto' no es necesariamente el mismo que el nombre del ensamblado.

1

Utilice la clase Path en lugar de tratar de reinventar la rueda y calcular manualmente los índices de subcadena.

1

Simplemente elimine el segundo parámetro de la llamada a Subcadena. De la documentación:

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

Esto también funciona :-) – Karan

0

me gustaría probar el acceso al atributo AssemblyTitle en su archivo AssemblyInfo. La ubicación de cualquier conjunto puede no ser la misma que el nombre del proyecto. Prueba esto:

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

hth

Cuestiones relacionadas