2012-03-03 12 views
5

avrei potuto fare questo:qual è il modo giusto per ottenere il nome della mia winforms application?

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

o

return Path.GetFileNameWithoutExtension(Application.ExecutablePath); 

sarebbero entrambi dare il nome dell'applicazione desiderata sempre ?? Se sì, quale è un modo più standard per ottenere il nome dell'applicazione? Se è ancora una situazione senza vincita c'è qualcosa come un metodo è più veloce dell'altro? Oppure c'è un altro approccio giusto?

Grazie.

+2

Difficile indovinare cosa intendi per "nome applicazione", il contesto è importante. Entrambi restituiranno il nome del file * EXE *. La stessa cosa del nome del processo. –

+0

@HansPassant oh, intendo il nome principale del mio prodotto. Ad esempio per MS Word, è "Microsoft Word" e non "WINWORD". Nel mio caso, il nome che ho codificato in Proprietà dell'applicazione come Nome assembly. Quale sarebbe l'approccio per ottenerlo? – nawfal

risposta

1

Dipende da come si definisce 'nome applicazione'.

Application.ExecutablePath restituisce il percorso per il file eseguibile che ha avviato l'applicazione, incluso il nome dell'eseguibile, questo significa che se qualcuno rinomina il file il valore cambia.

Assembly.GetEntryAssembly().GetName().Name restituisce il nome semplice dell'assembly. Questo è solitamente, ma non necessariamente, il nome file del file manifest dell'assembly, meno la sua estensione

Quindi, il nome GetName(). Sembra più affidabile.

Per quello più veloce, non lo so. Presumo che ExecutablePath sia più veloce di GetName() perché in GetName() richiede Reflection, ma questo dovrebbe essere misurato.

EDIT:

cercare di costruire questa applicazione console, eseguirlo e quindi provare a rinominare il nome del file eseguibile utilizzando il file di Windows Explorer, eseguire nuovamente direttamente con il doppio click sul file eseguibile rinominato.
L'ExecutablePath riflette il cambiamento, il nome di Assemblea è sempre lo stesso

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

Sai in quale scenario differiscono? il nome dell'eseguibile (da 'ExecutablePath') sembra essere esattamente il nome dell'assembly. – nawfal

+0

Vedere l'aggiornamento nella risposta – Steve

+0

grazie .. Haa ho perso quel trucco! :) – nawfal

4

A seconda di cosa si sta prendendo in considerazione per essere il nome applicazione, c'è anche una terza opzione: ottenere il titolo di montaggio o il nome del prodotto (quelli di solito sono dichiarati in 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

Grazie, tornerò .. – nawfal

+0

perché il controllo 'titleAttributes [0] è AssemblyTitleAttribute' fatto qui? Abbiamo già interrogato la stessa cosa, giusto? – nawfal

+0

@nawfal: Sì, hai ragione, è altamente improbabile che gli elementi nell'array siano di qualsiasi altro tipo, ma alcuni strumenti di analisi del codice statico (come ReSharper) contrassegneranno questo codice come una potenziale minaccia 'NullReferenceException' perché' obj as T' espressione valuterà a 'null' se' obj' non è 'T'. Scrivendo 'obj is T' prima di' obj as T', questi strumenti sapranno al momento della compilazione che non verranno lanciate eccezioni. –