2009-06-11 8 views
83

संभव डुप्लिकेट:
How do I get the name of the current executable in C#?मैं वर्तमान निष्पादन योग्य फ़ाइल नाम कैसे ढूंढूं?

एक निष्पादन योग्य फ़ाइल एक बाहरी पुस्तकालय लोड करता है।
लाइब्रेरी को निष्पादन योग्य फ़ाइल को जानने का कोई तरीका है?

(मैं शपथ ली है | मैं इस कहीं और का जवाब देखा है, लेकिन मैं इसे अब और खोजने के लिए प्रतीत नहीं कर सकते हैं)

उत्तर

112
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 
+7

यह एक ".vost" जोड़ने के लिए जाता है। फ़ाइल नाम में, System.Reflection.Assembly.GetEntryAssembly() का उपयोग करते समय कोई समस्या मौजूद नहीं है। स्थान (वैकल्पिक उत्तर देखें)। – Contango

+4

@Contango, जो वीएस में "विजुअल स्टूडियो होस्टिंग प्रोसेस" का उपयोग करके होता है। – LuddyPants

+0

वीएस 2012 में यूनिट परीक्षण के लिए। प्रक्रिया नाम: vstest.executionengine.x86 कॉन्फ़िगरेशनफ़ाइल: सी: \ टीएफएस \ टेस्ट \ MyData.Tests.v4.0 \ bin \ Debug \ MyData.Tests.v4.0.dll.config MainModule.FileName: C: \ Program Files (x86) \ माइक्रोसॉफ्ट विजुअल स्टूडियो 11.0 \ Common7 \ IDE \ COMMONEXTENSIONS \ Microsoft \ TESTWINDOW \ MainModule.ModuleName vstest.executionengine.x86.exe: vstest.executionengine.x86.exe FriendlyName : यूनिटटेस्ट एडाप्टर: रनिंग टेस्ट – Kiquenet

7

मुझे लगता है कि यह होना चाहिए कि आप क्या चाहते:

System.Reflection.Assembly.GetEntryAssembly().Location 

यह रिटर्न जिस प्रक्रिया को पहली बार शुरू किया गया था जब प्रक्रिया शुरू हुई थी, जो आप चाहते हैं कि ऐसा प्रतीत होता है।

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

+0

मैं GetCallingAssembly() के बारे में निश्चित नहीं है - क्या वह उस असेंबली को वापस नहीं करता है जिसमें कॉलिंग विधि (कॉल स्टैक पर एक) शामिल है? यह निष्पादन योग्य की बजाय पुस्तकालय होने की संभावना है। –

+0

@ मार्टिन: हाँ, आप सही हैं। GetCallingAssembly कुछ मामलों में काम कर सकते हैं/अपरिवर्तित हो सकते हैं, लेकिन ऐसा लगता है कि वह यहां GetEntryAssembly चाहता है। – Noldorin

70

आप निष्पादन योग्य चाहते हैं:

System.Reflection.Assembly.GetEntryAssembly().Location 

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

System.Reflection.Assembly.GetCallingAssembly().Location 

यदि आप पसंद करेंगे ई सिर्फ फ़ाइल नाम और न पथ, उपयोग:

Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location) 
+6

अप्रबंधित कोड से बुलाए जाने पर GetEntryAssembly शून्य वापस आ सकता है। –

+0

मुझे विश्वास नहीं है कि यह निष्पादन योग्य नहीं है यदि .NET अनुप्रयोग नहीं है। उदाहरण के लिए, आईआईएस कार्यकर्ता प्रक्रियाओं (w3wp.exe) को स्पिन करता है जो अप्रबंधित निष्पादन योग्य हैं जो आंतरिक रूप से सीएलआर का एक उदाहरण स्पिन करता है जो प्रबंधित कोड निष्पादित करता है। यदि आप इसे प्रबंधित कोड के भीतर से उपयोग करते हैं तो मुझे विश्वास नहीं है कि आपको w3wp.exe का मार्ग मिलेगा। –

40

ऊपर जवाब के अलावा।

मैं सांत्वना आवेदन

static void Main(string[] args) { 
    Console.WriteLine(
    System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); 
    Console.WriteLine(
    System.Reflection.Assembly.GetEntryAssembly().Location); 
    Console.WriteLine(
    System.Reflection.Assembly.GetExecutingAssembly().Location); 
    Console.WriteLine(
    System.Reflection.Assembly.GetCallingAssembly().Location); 
} 

तब मैं परियोजना संकलित रूप में निम्नलिखित test.exe लिखा था और test2.exe फाइल करने के लिए इसके उत्पादन का नया नाम दिया। आउटपुट लाइनें सही थीं और वही थीं।

लेकिन, अगर मैं दृश्य स्टूडियो में इसे शुरू, परिणाम है:

घ: \ test2.vhost.exe

घ: \ test2.exe

घ: \ test2.exe

C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorlib.dll

विजुअल स्टूडियो में रीशेपर प्लग-इन ने

System.Diagnostics.Process.GetCurrentProcess().MainModule 

संभव सिस्टम के रूप में रेखांकित किया है।शून्य संदर्भ अपवाद। यदि आप मेन मॉड्यूल के दस्तावेज़ीकरण को देखते हैं तो आप पाएंगे कि यह संपत्ति भी समर्थित नहीं है अपवादित अपवाद, प्लेटफ़ॉर्म नॉट समर्थितपोर्ट अपवाद और अवैधऑपरेशन अपवाद।

GetEntryAssembly विधि भी 100% "सुरक्षित" नहीं है। MSDN:

GetEntryAssembly विधि अशक्त लौट सकते हैं जब एक कामयाब विधानसभा एक अप्रबंधित आवेदन से लोड किया गया है। उदाहरण के लिए, यदि अप्रबंधित एप्लिकेशन सी # घटक सी # में लिखित एक COM घटक का एक उदाहरण बनाता है, तो सी # घटक से GetEntryAssembly विधि को कॉल शून्य देता है, क्योंकि प्रक्रिया के लिए प्रविष्टि बिंदु प्रबंधित प्रबंधित असेंबली के बजाय कोड अप्रबंधित था ।

मेरे समाधान के लिए, मैं Assembly.GetEntryAssembly().Location पसंद करता हूं।

वर्चुअलाइजेशन के लिए समस्या को हल करने की आवश्यकता होने पर अधिक रुचि है। उदाहरण के लिए, हमारे पास एक प्रोजेक्ट है, जहां हम एक निष्पादन योग्य में .NET कोड को लिंक करने के लिए ज़ेनोकोड पोस्टबिल्ड का उपयोग करते हैं। इस निष्पादन योग्य का नाम बदला जाना चाहिए। तो उपर्युक्त सभी विधियां काम नहीं करतीं, क्योंकि उन्हें केवल मूल असेंबली या आंतरिक प्रक्रिया के लिए जानकारी मिलती है।

एकमात्र समाधान मैंने पाया

var location = System.Reflection.Assembly.GetEntryAssembly().Location; 
var directory = System.IO.Path.GetDirectoryName(location); 
var file = System.IO.Path.Combine(directory, 
    System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe"); 
+1

यदि आप आईआईएस के तहत डीबग मोड में डब्ल्यूसीएफ सेवा अनुप्रयोग चला रहे हैं तो GetEntryAssembly विधि भी शून्य हो जाती है। यह स्वीकार्य रूप से, एक दुर्लभ स्थिति है कि केवल एक डेवलपर का सामना करना पड़ेगा। – Contango

+0

असेंबली। गेटएन्ट्रीएस्परब्स() मेरे लिए शून्य है, जब मैं एडिन वीएस 2008 का उपयोग करता हूं। System.Diagnostics.Process.GetCurrentProcess()।MainModule devenv.exe है, लेकिन एडिन के साथ मेरा डीएलएल नहीं है। और मुझे नहीं पता कि एडीन का उपयोग करने वाली दूसरी असेंबली से विधानसभा (एडिन का) प्राप्त करें। – Kiquenet

+0

1) यदि Aexe B.dll का उपयोग करता है, और B.dll C.dll का उपयोग करता है, तो क्या होता है यदि वह कोड C.dll में है? 2) ऐपडोमेन एक एक्सई एप्लीकेशन, वेब एप्लिकेशन, यूनिट टेस्ट एप्लिकेशन, एडिन विजुअल स्टूडियो, और "सिल्वरलाइट ऐप" (?) हो सकता है। शायद सभी मामलों के लिए दिलचस्प पूर्ण समाधान। – Kiquenet

2

है यह एक शामिल नहीं किया गया:

System.Windows.Forms.Application.ExecutablePath; 

~ जो

+1

यह हमेशा मुझे गूंगा लग रहा था कि फॉर्म नेमस्पेस में वह एप्लीकेशन क्लास था ... यह फ़ॉर्म से पूरी तरह से असंबंधित नहीं है। – Nyerguds

+0

एलओएल - हाँ, मैं इसका उपयोग नहीं करता हूं। इसे खोजने के लिए अजीब जगह। – jp2code

+4

असल में, एप्लिकेशन क्लास विशेष रूप से फॉर्म से संबंधित है, जिसमें एप्लिकेशन.रुन विधि मुख्य विंडो संदेश लूप शुरू करती है जो सभी विंडो (ए.के.ए. "फॉर्म") घटनाओं को संसाधित करती है। इसमें DoEvents() भी शामिल है जो विंडो को हैंडलर के अंदर लंबित घटनाओं को संसाधित करने की अनुमति देता है। यह सभी को किसी भी व्यक्ति से परिचित होना चाहिए जिसने .NET के आविष्कार से पहले Win32 API प्रोग्राम किया था। – Triynko

संबंधित मुद्दे