2012-03-03 16 views
5

que podía hacer esto:¿Cuál es la forma correcta de obtener el nombre de mi aplicación winforms?

return Assembly.GetEntryAssembly().GetName().Name; 

o

return Path.GetFileNameWithoutExtension(Application.ExecutablePath); 

¿Sería tanto dar el nombre de la aplicación deseada siempre ?? Si es así, ¿cuál es una forma más estándar de obtener el nombre de la aplicación? Si sigue siendo una situación sin salida, ¿existe algo así como que un método sea más rápido que el otro? ¿O hay otro enfoque correcto?

Gracias.

+2

Es difícil adivinar a qué se refiere con "nombre de la aplicación", el contexto es importante. Ambos devolverán el nombre de archivo * EXE *. Lo mismo que el nombre del proceso. –

+0

@HansPassant oh, me refiero al nombre principal de mi producto. Por ejemplo, para MS Word, es "Microsoft Word" y no "WINWORD". En mi caso, ese nombre que codifiqué en Application Properties como Assembly Name. ¿Cuál sería el enfoque para conseguir eso? – nawfal

Respuesta

1

Depende de cómo se defina 'nombre de la aplicación'.

Application.ExecutablePath devuelve la ruta del archivo ejecutable que inició la aplicación, incluido el nombre del ejecutable, esto significa que si alguien cambia el nombre del archivo, el valor cambia.

Assembly.GetEntryAssembly().GetName().Name devuelve el nombre simple del conjunto. Este es generalmente, pero no necesariamente, el nombre de archivo del archivo de manifiesto del ensamblado, menos su extensión

Por lo tanto, el nombre de GetName(). Parece más affidable.

Para la más rápida, no sé. Supongo que ExecutablePath es más rápido que GetName() porque en GetName() requiere Reflection, pero esto debe medirse.

EDIT:

Pruebe a generar esta aplicación de consola, ejecutarlo y luego tratar de cambiar el nombre del nombre del archivo ejecutable utilizando el Explorador de archivos de Windows, ejecute de nuevo directamente con el doble clic sobre el ejecutable renombrado.
El ExecutablePath refleja el cambio, el nombre de la Asamblea sigue siendo el mismo

using System; 
using System.Reflection; 
using System.Windows.Forms; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(Assembly.GetEntryAssembly().GetName().Name); 
      Console.WriteLine(Application.ExecutablePath); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

¿Sabe en qué situación difieren? el nombre del ejecutable (de 'ExecutablePath') parece ser exactamente el nombre del ensamblado. – nawfal

+0

Ver la actualización en la respuesta – Steve

+0

gracias .. ¡Haa, he echado de menos ese truco! :) – nawfal

4

Dependiendo de lo que usted está considerando la posibilidad de ser el nombre aplicación, hay incluso una tercera opción: conseguir el título de montaje o el nombre del producto (los que se declaran por lo general en AssemblyInfo.cs):

object[] titleAttributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), true); 
if (titleAttributes.Length > 0 && titleAttributes[0] is AssemblyTitleAttribute) 
{ 
    string assemblyTitle = (titleAttributes[0] as AssemblyTitleAttribute).Title; 
    MessageBox.Show(assemblyTitle); 
} 

o:

object[] productAttributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), true); 
if (productAttributes.Length > 0 && productAttributes[0] is AssemblyProductAttribute) 
{ 
    string productName = (productAttributes[0] as AssemblyProductAttribute).Product; 
    MessageBox.Show(productName); 
} 
+0

Gracias, volveré .. – nawfal

+0

¿Por qué 'titleAttributes [0] es la verificación AssemblyTitleAttribute' hecha aquí? Ya hemos consultado lo mismo ¿verdad? – nawfal

+0

@nawfal: Sí, tienes razón, es muy poco probable que los elementos del conjunto sean de otro tipo, pero ciertas herramientas de análisis de código estático (como ReSharper) marcarán este código como una posible amenaza 'NullReferenceException' porque' obj como expresión T' evaluará 'null' si' obj' no es 'T'. Al escribir 'obj es T' antes de' obj como T', estas herramientas sabrán en tiempo de compilación que no se lanzarán excepciones. –

Cuestiones relacionadas