2012-03-03 10 views
5

私のwinformsアプリケーションの名前を取得する正しい方法は何ですか?私はこれを行うことができます

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

またはその両方が必要なアプリケーション名は常にに与えるだろう

return Path.GetFileNameWithoutExtension(Application.ExecutablePath); 

?もしそうなら、これはアプリケーション名を取得するためのより標準的な方法ですか?まだ勝利していない状況がある場合、一方の方法のようなものは他の方法よりも速いのですか?そうでなければ他の正しいアプローチがありますか?

ありがとうございました。

+2

「アプリケーション名」の意味を推測するのは難しいですが、文脈が重要です。どちらもEXE *ファイル名*を返します。プロセス名と同じこと。 –

+0

@HansPassantああ、私の製品のメイン名です。たとえば、MS Wordの場合、「WINWORD」ではなく「Microsoft Word」です。私の場合、アセンブリ名としてApplication Propertiesにハードコードした名前。それを得るためのアプローチは何でしょうか? – nawfal

答えて

1

「アプリケーション名」の定義方法によって異なります。

Application.ExecutablePathは、実行可能ファイルの名前を含め、アプリケーションを起動した実行可能ファイルのパスを返します。これは、ファイルの名前を変更すると値が変更されることを意味します。

Assembly.GetEntryAssembly().GetName().Nameは、アセンブリの単純名を返します。これは通常、アセンブリのマニフェストファイルのファイル名からその拡張子を引いたものです。

したがって、GetName()。名前はより綿密です。

速いものについてはわかりません。私はGetName()がReflectionを必要とするためExecutablePathがGetName()より速いと推測しますが、これは測定する必要があります。

EDIT:

、このコンソールアプリケーションをビルドし、それを実行し、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

+0

答えの更新を参照してください – Steve

+0

ありがとう..ハァー私はそのハックを逃した! :) – nawfal

4

を見ても同じで、でもあります3番目のオプション:アセンブリタイトルまたは製品名を入手してください(通常は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

+0

なぜここで行われた 'titleAttributes [0] AssemblyTitleAttribute'ですか?私たちはすでに同じことを正しく質問していますか? – nawfal

+0

@nawfal:そうです、配列内のアイテムは他のタイプのものである可能性は非常に低いですが、ReSharperのような特定の静的コード解析ツールはこのコードを潜在的な 'NullReferenceException'脅威とマークします。 objがTならば 'obj'が' T'でないと評価されます。 'obj is T'の前に' obj is T'を書くことによって、これらのツールはコンパイル時に例外がスローされないことを知るでしょう。 –