2012-03-03 68 views
5

我可以這樣做:獲取我的winforms應用程序名稱的正確方法是什麼?

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

return Path.GetFileNameWithoutExtension(Application.ExecutablePath); 

既能得到所需要的應用程序名稱總是?如果是的話,哪個是獲取應用程序名稱的更加標準的方式?如果它仍然是一個不成功的情況,那麼有一種方法比另一種更快?或者還有其他的正確方法嗎?

謝謝。

+2

很難想象「應用程序名稱」是什麼意思,上下文很重要。兩者都將返回EXE *文件名*。與進程名稱相同。 – 2012-03-03 11:30:03

+0

@HansPassant哦,我的意思是我的產品的主要名稱。例如對於MS Word,它是「Microsoft Word」而不是「WINWORD」。在我的例子中,這個名稱是我在應用程序屬性中作爲程序集名稱硬編碼的。什麼是這樣的方法呢? – nawfal 2012-03-03 11:34:35

回答

1

這取決於你如何定義「應用程序名稱」。

Application.ExecutablePath返回啓動應用程序,包括可執行文件名的可執行文件的路徑,這意味着如果有人重命名文件的價值變化。

Assembly.GetEntryAssembly().GetName().Name返回集的簡單名稱。這通常是,但不一定,組件的清單文件的文件名,減去其擴展

因此,的GetName()。名稱似乎更affidable。

對於一個更快的,我不知道。我認爲ExecutablePath比GetName()更快,因爲在GetName()中需要Reflection,但這應該被測量。

編輯:

嘗試建立這個控制檯應用程序,運行它,然後嘗試重命名使用Windows資源管理器可執行文件名,再直接與重命名的可執行文件,雙擊運行。
的ExecutablePath反映了變化,大會名稱仍然是相同的

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

你知道他們在哪種情況下有所不同?可執行文件名稱(來自'ExecutablePath')看起來正是程序集的名稱。 – nawfal 2014-01-08 15:59:08

+0

請參閱答案 – Steve 2014-01-08 16:12:34

+0

中的更新謝謝..哈,我錯過了那個黑客! :) – nawfal 2014-01-08 16:13:58

4

取決於你正在考慮是應用程序名稱什麼看看,甚至還有第三種選擇:把裝配標題或產品名稱(那些通常在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); 
} 

或:

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

謝謝,我會回來.. – nawfal 2012-03-03 11:27:22

+0

爲什麼'titleAttributes [0]是AssemblyTitleAttribute'檢查完成在這裏?我們已經查詢過相同的東西了嗎? – nawfal 2012-03-03 14:37:04

+0

@nawfal:是的,你是對的,數組中的項目不太可能是任何其他類型的,但某些靜態代碼分析工具(如ReSharper)會將此代碼標記爲潛在的'NullReferenceException'威脅,因爲' obj,因爲如果obj不是'T',則T'表達式將評估爲'null'。通過在'obj'之前寫'obj T',這些工具會在編譯時知道不會拋出異常。 – 2012-03-03 15:04:37