मुझे C # में मौजूदा निष्पादन योग्य का नाम कैसे मिलेगा?


355

मैं वर्तमान में चल रहे कार्यक्रम का नाम प्राप्त करना चाहता हूं, जो कार्यक्रम का निष्पादन योग्य नाम है। C / C ++ में आप इसे प्राप्त करते हैं args[0]


निष्पादन योग्य फ़ाइल EXE फ़ाइल (Windows प्रपत्र, WPF अनुप्रयोग) है? एक प्रोग्राम एक डेस्कटॉप ऐप (WinForms, WPF; और WinRT- विंडोज फोन?), वेब एप्लीकेशन, Wcf सर्विस एप्लीकेशन, विजुअल स्टूडियो एडिन, आउटलुक-वर्ड एडिन, VS (MSTest) में यूनिट टेस्ट या, सिल्वरलाइट एप्लीकेशन हो सकता है।
क्रिकेनेट

जवाबों:


405
System.AppDomain.CurrentDomain.FriendlyName

61
स्वीकृत उत्तर से सावधान रहें। हमारे पास System.AppDomain.CurrentDomain.FriendlyNameक्लिक-वन्स परिनियोजित अनुप्रयोगों के तहत उपयोग करने के मुद्दे हैं। हमारे लिए, यह " DefaultDomain " लौटा रहा है , न कि मूल exe नाम।
गैसपोड

40
हमने इसे अंत में इस्तेमाल किया:string file = object_of_type_in_application_assembly.GetType().Assembly.Location; string app = System.IO.Path.GetFileNameWithoutExtension( file );
गैसपोड

4
FriendlyName कुछ भी सेट किया जा सकता है। यदि आपके पास कई dll के साथ एक exe है, तो विधानसभा स्थान प्राप्त करना भी पर्याप्त नहीं हो सकता है। इसके अलावा अगर आप कई AppDomain, असेंबली का उपयोग करते हैं। GetCallingAssembly () रिटर्न शून्य।
user276648

2
@Gaspode: पथ को कहना आसान होगा। GetFileNameWithoutExtension (Getype) (असेंबली।लोकेशन) - आपको वर्तमान असेंबली में एक प्रकार का ऑब्जेक्ट निर्दिष्ट करने की आवश्यकता नहीं है। आप इसका उपयोग कर सकते हैं GetType, और फिर आपको "यह" कहने की आवश्यकता नहीं है।
vbullinger

4
यह उपयोगी हो सकता है, लेकिन यह स्वीकृत जवाब नहीं होना चाहिए : यह जो कुछ पूछा गया था, उससे बहुत अलग है - यह संयोग से कुछ स्थितियों में एक ही बात होगी , लेकिन यह पूरी तरह से कुछ और है। यदि आप आवेदन खुद नहीं लिखते हैं तो यह बहुत अच्छी तरह से लौट सकता है "मुझे आलू पसंद है!" या आपके विनोदी सहकर्मी ने इस संपत्ति में जो कुछ भी लिखा था जब उन्होंने आवेदन बनाया था!
1

236

System.AppDomain.CurrentDomain.FriendlyName - एक्सटेंशन के साथ फ़ाइल नाम लौटाता है (जैसे MyApp.exe)।

System.Diagnostics.Process.GetCurrentProcess().ProcessName- बिना विस्तार के फ़ाइल नाम लौटाता है (जैसे MyApp)।

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName- पूर्ण पथ और फ़ाइल नाम लौटाता है (जैसे C: \ Examples \ Processes \ MyApp.exe)। फिर आप इसे पास कर सकते हैं System.IO.Path.GetFileName()या System.IO.Path.GetFileNameWithoutExtension()उपरोक्त परिणाम प्राप्त कर सकते हैं।


3
AppDomain एक EXE एप्लिकेशन, वेब एप्लिकेशन, यूनिट टेस्ट एप्लिकेशन, एडिन विजुअल स्टूडियो और "सिल्वरलाइट ऐप" (?) हो सकता है। शायद सभी मामलों के लिए दिलचस्प पूर्ण समाधान। उदाहरण के लिए, यूनिट टेस्ट VS2012 के लिए - ProcessName: vstest.executionengine.x86 MainModule.FileName: C: \ PROGRAM FILES (X86) \ MICROSOFT VISUAL STUDIO 10.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW \ vstest \ vstest MainModule.ModuleName: vstest.executionengine.x86.exe FriendlyName: UnitTestAdapter: रनिंग टेस्ट ApplicationName:
Kiquenet

एक "प्रोग्राम" एक डेस्कटॉप ऐप (WinForms, WPF; और WinRT- विंडोज फोन?), वेब एप्लीकेशन, Wcf सर्विस एप्लीकेशन, विजुअल स्टूडियो एडिन, आउटलुक-वर्ड एडिन, VS में यूनिट टेस्ट (MSTest), या, सिल्वरलाइट एप्लीकेशन हो सकता है। । उदाहरण के लिए, IIS में होस्ट की गई Wcf सेवा एप्लिकेशन के लिए सेवा होस्ट असेंबली कैसे प्राप्त करें, IISExpress या WebDevServer नहीं?
क्रिकेनेट

6
+1 मैं इस उत्तर के साथ जाने वाला हूं क्योंकि यह तीनों विविधताओं को प्रदान करता है जिनकी आपको साफ और सरल तरीके से आवश्यकता हो सकती है। पथ या एक्सटेंशन के बिना नंगे प्रोग्राम नाम का उपयोग करना इन-प्रोग्राम हेल्प टेक्स्ट ( /?स्विच) के लिए बहुत उपयोगी है , क्योंकि एक्सटेंशन और पथ का उपयोग करने से यह अनावश्यक रूप से अव्यवस्थित हो जाता है।
Synetech

2
के परिणाम को याद करने के लिए याद रखेंGetCurrentProcess()
महमूद अल-कुद्सी

Process.GetCurrentProcess().ProcessName()मेरे लिए MyApp.vshost लौटाता है ।
जोनाथन वुड

106

System.Diagnostics.Process.GetCurrentProcess()वर्तमान में चल रही प्रक्रिया हो जाती है। आप ProcessNameसंपत्ति का उपयोग नाम पता लगाने के लिए कर सकते हैं । नीचे एक नमूना कंसोल ऐप है।

using System;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Process.GetCurrentProcess().ProcessName);
        Console.ReadLine();
    }
}

36
बेहतर उपयोग करने की प्रक्रिया। GetCurrentProcess ()। MainModule.FileName
KindDragon

Process.GetCurrentProcess ()। MainModule.FileName एक Excel Addin (ExcelDNA) के भीतर से पूरी तरह से काम करता है
इयरकैम

10
मोनो रनटाइम पर उपयोग किए जाने पर यह दृष्टिकोण विफल हो जाएगा; मोनो पर चलने वाले एप्लिकेशन का प्रक्रिया नाम हमेशा .../bin/mono* nixes या .../mono.exeविंडोज पर कुछ प्रकार का होगा ।
cdhowie

1
यह स्वीकृत उत्तर होना चाहिए। वर्तमान AppDomain नाम को निष्पादन योग्य प्रक्रिया के नाम से कोई लेना-देना नहीं है, खासकर जब कई ऐप डोमेन मौजूद हैं
इवान क्रिव्याकोव

यह विधि असेंबली क्लास के साथ खेलने की तुलना में काफी धीमी हो सकती है।
इरविन मेयर

99

यह पर्याप्त होना चाहिए:

Environment.GetCommandLineArgs()[0];

3
हम्म, यह रिटर्न (जब vs.net से चलाया जाता है और डीबग होस्टिंग चीज़ का उपयोग करके), फ़ाइलनाम का स्थान और नाम .vshost.exe ... यह वास्तव में इस समय निष्पादित होने वाली फ़ाइल है)
फ्रेडरिक घीसू

13
यह मेरे लिए सबसे अच्छा जवाब है क्योंकि सी / सी ++ से Environment.GetCommandLineArgs()सटीक सी # एनालॉग है argv
फ्रेडरिक द फुल

माना! सबसे बढ़िया उत्तर। मुझे पर्यावरण प्राप्त करने की आवश्यकता है। GetCommandLineArgs () [1];
जेरी लियांग

1
पूर्ण पथ से बचने के लिए:Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0])
नाथन

1
WCF सेवाओं को ट्रैक करने की कोशिश करते समय यह अच्छी तरह से काम करता है। प्रक्रिया का नाम मेरे मामले में iisexpress के साथ वापस आता है। लेकिन यह कमांड मुझे वास्तविक WCF सेवा असेंबली नाम देता है।
पी। ब्रायन.मैकी

19

यह वह कोड है जो मेरे लिए काम करता है:

string fullName = Assembly.GetEntryAssembly().Location;
string myName = Path.GetFileNameWithoutExtension(fullName);

उपरोक्त सभी उदाहरणों ने मुझे vshost या रनिंग dll नाम के साथ प्रोसेसनाम दिया।


4
उन लोगों के लिए जो न जानते हैं, या अन्य उत्तरों में इसे याद नहीं करते हैं, असेंबली के लिए नाम स्थान System.Reflection है, और Path के लिए नामस्थान System.IO है।
मिलाना

4
GetEntryAssembly यदि एप्लिकेशन प्रविष्टि बिंदु एक असेंबली के बजाय मूल कोड में है, तो अशक्त हो जाएगा।
जूल

18

इसे इस्तेमाल करे:

System.Reflection.Assembly.GetExecutingAssembly()

यह आपको एक System.Reflection.Assemblyउदाहरण देता है जिसमें आपके पास सभी डेटा हैं जो आप कभी भी वर्तमान एप्लिकेशन के बारे में जानना चाहते हैं। मुझे लगता है कि Locationविशेष रूप से आपके पास संपत्ति हो सकती है।


6
यह .NET .NET की छाया प्रति सुविधा के सक्रिय होने के CodeBaseबजाय उपयोग करने के लिए अधिक सुरक्षित हो सकता Locationहै। ब्लॉगs.msdn.com/suzcook/archive/2003/06/26/… पर
डिर्क वोल्मार

18
GetExecutingAssembly () से सावधान रहें: यदि आप इसे लाइब्रेरी असेंबली से बुलाते हैं, तो यह लाइब्रेरी असेंबली का नाम लौटाता है, जो कि एंट्री असेंबली (मूल निष्पादन योग्य) के नाम से अलग है। यदि आप GetEntryAssembly () का उपयोग करते हैं, तो यह वास्तविक निष्पादन योग्य का नाम देता है, लेकिन यह एक अपवाद को फेंकता है यदि प्रक्रिया WCF (स्वाभाविक रूप से एक दुर्लभ स्थिति) के तहत चल रही है। सबसे मजबूत कोड के लिए, Process.GetCurrentProcess () का उपयोग करें। ProcessName
कंटैंगो

@ ग्रेविटास: निश्चित रूप से, कोई भी निष्पादन योग्य जो "व्याख्या" नहीं कर रहा है, जैसे / usr / bin / मोनो के साथ गलत प्रक्रिया नाम होगा। इसके अलावा ProcessName विंडोज़ सेवाओं के साथ काम नहीं करेगा। यदि आप इसे किसी लायब्रेरी में उपयोग करते हैं, तो GetCallingAssembly का उपयोग करें।
स्टेफेन स्टीगर

1
मेरे लिए काम किया। लौटे असेंबली उदाहरण GetName () कॉल की संपत्ति का नाम वह है जो आपको चाहिए, और इसमें ".exe" भाग शामिल नहीं है। अपेक्षित परिणाम के साथ मोनो / लिनक्स पर भी परीक्षण किया गया।
असेंबली.गेटनेम

1
हम्म, ध्यान दें कि लौटी स्ट्रिंग तब भी नहीं बदलेगी जब आप फ़ाइल एक्सप्लोरर का उपयोग करके निष्पादन योग्य फ़ाइल का नाम बदल देते हैं। जबकि पर्यावरण। GetCommandLineArgs () [0] वास्तविक निष्पादन योग्य फ़ाइल नाम (निश्चित रूप से) के साथ बदलता है। संयोग से, दूसरी विधि मेरी विशिष्ट स्थिति के लिए बेहतर हुई क्योंकि मैं चाहता हूं कि डेटा फ़ोल्डर को वास्तविक निष्पादन योग्य नाम के रूप में नामित किया जाए।
हाटेरू हंसौ


11

किसी ने यह सुझाव क्यों नहीं दिया, इसका सरल।

Path.GetFileName(Application.ExecutablePath)

3
एप्लिकेशन किस नाम स्थान पर रहता है।
जीतेंद्र Je ’

6
विंडोज फॉर्म ऐप के अंदर यह उपयोगी है, लेकिन अन्यथा नहीं
निनेबरी

@NineBerry आप में रुचि हो सकती Application.ExecutablePathहै स्रोत कोड
डरावना

@ नौनबेरी मेरी पोस्ट देखें। यदि आप System.Windows.Forms का संदर्भ जोड़ते हैं, तो यह कंसोल ऐप्स के भीतर काम करता है।
जॉन


9

यदि आपको फ़ायरवॉल नियम सेट करने के लिए प्रोग्राम नाम की आवश्यकता है, तो उपयोग करें:

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

यह सुनिश्चित करेगा कि VisualStudio में डिबगिंग करते समय और विंडोज़ में सीधे ऐप चलाने के दौरान नाम सही है।


2
मेरे उद्देश्यों के लिए (लॉगिंग फ़ाइल नाम बनाना), यह सबसे अच्छा जवाब है। यदि एक होस्ट की गई प्रक्रिया (कहते हैं, एक सेवा, या एक वेब अनुप्रयोग) चल रही है, तो System.AppDomain.CurrentDomain.FriendlyName एक बदसूरत GUID-y नाम वापस कर सकता है जिसमें एम्बेडेड स्लैश हैं।
कर्ट

8

जब अनिश्चित या संदेह में, हलकों में चलाएं, चिल्लाओ और चिल्लाओ।

class Ourself
{
    public static string OurFileName() {
        System.Reflection.Assembly _objParentAssembly;

        if (System.Reflection.Assembly.GetEntryAssembly() == null)
            _objParentAssembly = System.Reflection.Assembly.GetCallingAssembly();
        else
            _objParentAssembly = System.Reflection.Assembly.GetEntryAssembly();

        if (_objParentAssembly.CodeBase.StartsWith("http://"))
            throw new System.IO.IOException("Deployed from URL");

        if (System.IO.File.Exists(_objParentAssembly.Location))
            return _objParentAssembly.Location;
        if (System.IO.File.Exists(System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName))
            return System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName;
        if (System.IO.File.Exists(System.Reflection.Assembly.GetExecutingAssembly().Location))
            return System.Reflection.Assembly.GetExecutingAssembly().Location;

        throw new System.IO.IOException("Assembly not found");
    }
}

मैं प्रत्येक विकल्प का परीक्षण करने का दावा नहीं कर सकता, लेकिन यह डीबगिंग सत्र के दौरान vhost को वापस करने जैसा कुछ भी बेवकूफ नहीं करता है।


2
मनोरंजन के लिए +1। :-) मैं शायद ही इस कोड का उपयोग करूंगा, हालांकि, जब तक मैं वास्तव में सामान्य पुस्तकालय नहीं लिख रहा हूं, जिसके पर्यावरण के बारे में कोई जानकारी नहीं है (और तब शायद यह कोई अच्छा विचार नहीं होगा कि आप जिस भी वैश्विक राज्य का उपयोग करने जा रहे हैं। के लिए नाम)।
एंड्री टारनटोसव

@ ऑरवेलोफाइल ए "प्रोग्राम" एक डेस्कटॉप ऐप (WinForms, WPF; और WinR- विंडोज फोन?), वेब एप्लीकेशन, Wcf सर्विस एप्लीकेशन, विजुअल स्टूडियो एडिन, आउटलुक-वर्ड एडिन, वीएस (MSTest) में यूनिट टेस्ट, या हो सकता है? सिल्वरलाइट एप्लीकेशन। उदाहरण के लिए, IIS में होस्ट की गई Wcf सेवा एप्लिकेशन के लिए सेवा होस्ट असेंबली कैसे प्राप्त करें, IISExpress या WebDevServer नहीं? किसी भी WinForms, WPF, वेब अनुप्रयोग, Wcf सेवा अनुप्रयोग, विज़ुअल स्टूडियो एडिन, आउटलुक-वर्ड एडिन, VS (MSTest) यूनिट टेस्ट में यूनिट टेस्ट के लिए मान्य कोई भी पूर्ण कोड?
क्रिकेनेट

8
  • System.Reflection.Assembly.GetEntryAssembly().Location एक्साइज़ नाम का रिटर्न स्थान यदि स्मृति से असेंबली लोड नहीं है।
  • System.Reflection.Assembly.GetEntryAssembly().CodeBase URL के रूप में स्थान देता है।

परीक्षण किया गया, यह 100% काम करता है, भले ही इसे C # लाइब्रेरी के भीतर से बुलाया गया हो।
कंटैंगो

1
यदि आप मुख्य AppDomain में नहीं हैं तो GetEntryAssembly () शून्य हो जाता है।
user276648

4

यदि आप अपने निष्पादन योग्य की पूर्ण पथ जानकारी की तलाश में हैं, तो ऐसा करने का विश्वसनीय तरीका निम्नलिखित है:

   var executable = System.Diagnostics.Process.GetCurrentProcess().MainModule
                       .FileName.Replace(".vshost", "");

यह मध्यस्थ dlls, vshost, आदि के साथ किसी भी मुद्दे को समाप्त करता है।


मैंने Ubuntu Linux 15.10 C ++ में अपना विश्वसनीय तरीका आज़माया, इसके बाद realpath का उपयोग करके STL C ++ स्ट्रिंग को प्रतिस्थापित किया और इसने प्वाइंट और क्लिक को विफल किया। क्या आज हमारे सॉफ्टवेयर के निदेशक के रूप में मोनो में बग के कारण ऐसा हो सकता है? धन्यवाद।
फ्रैंक

मैं मोनो पर कार्यक्रम नहीं करता, हालांकि यह कोशिश करने के लिए मजेदार हो सकता है
मेयर

Gasponde ने लिखा है कि "हमारे पास System.AppDomain.CurrentDomain.FriendlyName का उपयोग करने के लिए क्लिक-वन्स किए गए एप्लिकेशन के तहत समस्याएँ हैं।" क्या आप यह अनुमान लगा सकते हैं कि .NET में एक बार क्लिक किए गए एप्लिकेशन के साथ समस्याएँ क्या हो सकती हैं? धन्यवाद।
फ्रैंक

VS2017 में मेरे सैंपल प्रोग्राम के लिए रिटर्न C: \ Program Files \ dotnet \ dotnet.exe।
jwdonahue

3

आप Environment.GetCommandLineArgs()तर्कों Environment.CommandLineको प्राप्त करने के लिए और प्रवेश के रूप में वास्तविक कमांड लाइन प्राप्त करने के लिए उपयोग कर सकते हैं ।

इसके अलावा, आप उपयोग कर सकते हैं Assembly.GetEntryAssembly()या Process.GetCurrentProcess()

हालाँकि, डीबग करते समय, आपको सावधान रहना चाहिए क्योंकि यह अंतिम उदाहरण आपके डिबगर का निष्पादन योग्य नाम दे सकता है (आपके डिबगर के बजाय आप डिबगर कैसे संलग्न करते हैं) के आधार पर, अन्य उदाहरणों के अनुसार।


4
GetExecutingAssembly () से सावधान रहें: यदि आप इसे लाइब्रेरी असेंबली से बुलाते हैं, तो यह लाइब्रेरी असेंबली का नाम लौटाता है, जो कि एंट्री असेंबली (मूल निष्पादन योग्य) के नाम से अलग है। यदि आप GetEntryAssembly () का उपयोग करते हैं, तो यह वास्तविक निष्पादन योग्य का नाम देता है, लेकिन यह एक अपवाद को फेंकता है यदि प्रक्रिया WCF (स्वाभाविक रूप से एक दुर्लभ स्थिति) के तहत चल रही है। सबसे मजबूत कोड के लिए, Process.GetCurrentProcess () का उपयोग करें। ProcessName
कॉन्टैंगो

@ ग्रेविटास: अच्छी बात है - वाह, मुझे यह लिखते हुए कुछ समय हो गया है! : D मैं तदनुसार संपादित करता हूँ
जेफ Yates

Environment.CommandLineनिरपेक्ष पथ देता है, दर्ज कमांड लाइन नहीं, कम से कम मोनो / लिनक्स पर।
मैकेनिकल घोंघा

@ मेकैनिकल: मानो की तरह लगता है कि प्रलेखन का पालन नहीं करता है। दिलचस्प।
जेफ येट्स

1

क्या ये वही है जो तुम चाहते हो:

Assembly.GetExecutingAssembly ().Location

4
GetExecutingAssembly () से सावधान रहें: यदि आप इसे लाइब्रेरी असेंबली से बुलाते हैं, तो यह लाइब्रेरी असेंबली का नाम लौटाता है, जो कि एंट्री असेंबली (मूल निष्पादन योग्य) के नाम से अलग है। यदि आप GetEntryAssembly () का उपयोग करते हैं, तो यह वास्तविक निष्पादन योग्य का नाम देता है, लेकिन यह एक अपवाद को फेंकता है यदि प्रक्रिया WCF (स्वाभाविक रूप से एक दुर्लभ स्थिति) के तहत चल रही है। सबसे मजबूत कोड के लिए, Process.GetCurrentProcess () का उपयोग करें। ProcessName
कॉन्टैंगो

एक प्रश्न का उत्तर नहीं होना चाहिए। क्या यही ओपी चाहता था?
jwdonahue

1

.नेट कोर (या मोनो) पर, अधिकांश जवाब तब लागू नहीं होंगे जब बाइनरी को परिभाषित करने की प्रक्रिया मोनो या .Net कोर (डॉटनेट) की रनटाइम बाइनरी है और न कि आपका वास्तविक आवेदन उस मामले में आपकी रुचि है। , इसे इस्तेमाल करो:

var myName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location);

1
GetEntryAssembly()अशक्त लौट सकते हैं।
user2864740

1

विंडोज़ ऐप्स (फ़ॉर्म और कंसोल) के लिए मैं इसका उपयोग करता हूं:

इसमें System.Windows.Forms का संदर्भ फिर VS में जोड़ें:

using System.Windows.Forms;
namespace whatever
{
    class Program
    {
        static string ApplicationName = Application.ProductName.ToString();
        static void Main(string[] args)
        {
            ........
        }
    }
}

यह मेरे लिए सही ढंग से काम करता है कि क्या मैं वीएस के भीतर वास्तविक निष्पादन योग्य या डिबगिंग चला रहा हूं।

ध्यान दें कि यह एक्सटेंशन के बिना आवेदन नाम लौटाता है।

जॉन


1

सुपर आसान, यहाँ:

Environment.CurrentDirectory + "\\" + Process.GetCurrentProcess().ProcessName

1
.NET कोर प्रक्रिया के लिए। GetCurrentProcess ()। ProcessName "dotnet" देता है।
इवगेनी नाबोकोव

1
वर्तमान निर्देशिका अस्थायी रूप से क्षणिक है और इसे विधानसभा / निष्पादन योग्य होने का स्थान नहीं माना जा सकता है।
jwdonahue

1

यह काम करता है यदि आपको बिना एक्सटेंशन के केवल आवेदन नाम की आवश्यकता है:

Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.