2012-03-03 18 views
5

मैं ऐसा कर सकता है:मेरे Winforms एप्लिकेशन का नाम प्राप्त करने का सही तरीका क्या है?

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

या

return Path.GetFileNameWithoutExtension(Application.ExecutablePath); 

दोनों वांछित आवेदन नाम हमेशा देना चाहेंगे ?? यदि ऐसा है तो आवेदन नाम प्राप्त करने का एक और मानक तरीका कौन सा है? यदि यह अभी भी एक जीत की स्थिति है तो क्या एक विधि की तरह कुछ भी दूसरे की तुलना में तेज़ है? या फिर कोई और सही दृष्टिकोण है?

धन्यवाद।

+2

अनुमान लगाने के लिए मुश्किल है कि "एप्लिकेशन नाम", संदर्भ मामलों से आपका क्या मतलब है। दोनों EXE * फ़ाइल नाम * वापस कर देंगे। प्रक्रिया नाम के समान ही बात। –

+0

@ हंसपैसेंट ओह, मेरा मतलब है मेरे उत्पाद का मुख्य नाम। उदाहरण के लिए एमएस वर्ड के लिए, यह "माइक्रोसॉफ्ट वर्ड" है और "विनवर्ड" नहीं है। मेरे मामले में, वह नाम जिसे मैंने एप्लिकेशन प्रॉपर्टीज में असेंबली नाम के रूप में हार्डकोड किया है। इसे पाने का दृष्टिकोण क्या होगा? – nawfal

उत्तर

1

यह निर्भर करता है कि आप 'एप्लिकेशन नाम' को कैसे परिभाषित करते हैं।

Application.ExecutablePath निष्पादन योग्य फ़ाइल के लिए पथ लौटाता है जिसने निष्पादन योग्य नाम सहित एप्लिकेशन शुरू किया, इसका मतलब है कि अगर कोई फ़ाइल का नाम बदलता है तो मूल्य बदल जाता है।

Assembly.GetEntryAssembly().GetName().Name असेंबली का सरल नाम देता है। यह आमतौर पर, लेकिन आवश्यक नहीं है, असेंबली की मेनिफेस्ट फ़ाइल का फ़ाइल नाम, इसके विस्तार को घटाएं

तो, GetName()। नाम अधिक भरोसेमंद प्रतीत होता है।

तेजी से, मुझे नहीं पता। मुझे लगता है कि निष्पादन योग्य पाथ GetName() से तेज है क्योंकि GetName() में प्रतिबिंब की आवश्यकता है, लेकिन इसे मापा जाना चाहिए।

संपादित करें:

, इस कंसोल अनुप्रयोग का निर्माण करने की इसे चलाने और फिर 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

क्या आप जानते हैं कि वे किस परिदृश्य में भिन्न हैं? निष्पादन योग्य नाम ('निष्पादन योग्य पाथ 'से) वास्तव में असेंबली का नाम प्रतीत होता है। – nawfal

+0

उत्तर में अद्यतन देखें – Steve

+0

धन्यवाद .. हा मैं उस हैक को याद किया! :) – nawfal

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

+0

शीर्षक शीर्षक [0] विधानसभा टाइटल एट्रिब्यूट क्यों है? हम पहले से ही वही बात पूछ चुके हैं? – nawfal

+0

@nawfal: हाँ, आप सही हैं, यह बेहद असंभव है कि सरणी में आइटम किसी अन्य प्रकार के होंगे, लेकिन कुछ स्थैतिक कोड विश्लेषण टूल (जैसे रीशेपर) इस कोड को संभावित 'NullReferenceException' खतरे के रूप में चिह्नित करेंगे क्योंकि ' ओबीजे टी 'अभिव्यक्ति के रूप में' शून्य 'का मूल्यांकन करेगा यदि 'obj'' t' नहीं है। 'ओबीजे 'टी' के रूप में 'ओबीजे' से पहले टी 'लिखकर, इन उपकरणों को संकलित समय पर पता चलेगा कि कोई अपवाद नहीं फेंक दिया जाएगा। –