2009-01-29 12 views
19

मुझे पूरा यकीन है कि एक Windows सेवा को InstallUtil.exe का उपयोग करते समय स्थापित करते समय इसकी कार्यशील निर्देशिका के रूप में C: \ winnt (या समान) प्राप्त होता है। क्या कोई तरीका है जिसे मैं एक्सेस कर सकता हूं, या अन्यथा (इंस्टॉल समय पर) कैप्चर कर सकता हूं, जिस निर्देशिका से सेवा मूल रूप से स्थापित की गई थी? फिलहाल मैं मैन्युअल रूप से app.exe.config फ़ाइल में प्रवेश कर रहा हूं, लेकिन यह बेहद मैनुअल है और हैक की तरह लगता है।सी # का उपयोग करते हुए, मुझे विंडोज सेवा की इंस्टॉल निर्देशिका कैसे मिलती है?

क्या प्रोग्राम प्रोग्राम स्थापित किया गया था, यह निर्धारित करने के लिए रन प्रोग्राम या इंस्टॉल समय पर कोई प्रोग्रामेटिक तरीका है?

उत्तर

33

आप निष्पादन असेंबली का स्थान प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकते हैं। यहाँ एक सरल दिनचर्या है कि विधानसभा को क्रियान्वित करने का उपयोग कर प्रतिबिंब के स्थान पर काम कर निर्देशिका सेट है:

String path = System.Reflection.Assembly.GetExecutingAssembly().Location; 
path = System.IO.Path.GetDirectoryName(path); 
Directory.SetCurrentDirectory(path); 
+1

क्या यह 'सी: \ विंडोज \ system32' नहीं देता है? – ProfK

+0

@ProfK, नहीं, यह निष्पादन असेंबली का स्थान देता है। यह प्रोग्राम चलाने के लिए वास्तविक निष्पादन योग्य की निर्देशिका होगी। –

+0

मेरा बुरा। मैंने अपनी सेवा को 'सी: \ विंडोज \ system32' में app.config की तलाश में पाया और माना कि यह सोचा था कि इसका स्थान वहां था। – ProfK

7

क्या आपका मतलब है कि आप असेंबली वाली निर्देशिका चाहते हैं? यदि ऐसा है, तो यह आसान है: Assembly.Location का उपयोग करें।

मैं हालांकि परिवर्तन प्रक्रिया के कार्यशील निर्देशिका के लिए कोशिश नहीं - मैं नहीं करता है, तो वास्तव में आप यह करने के लिए अनुमति हो, कि अगर बुरा दुष्प्रभाव हुए आश्चर्य होगा।

+0

धन्यवाद, जॉन। आप सही थे, सवाल बिल्कुल सही ढंग से नहीं कहा गया था, इसलिए मैंने इसे बदल दिया है। – endian

+0

तो जॉन, यह पुष्टि हुई है कि कोई भी इंस्टॉल होने और/या चलने के बाद किसी सेवा के कार्य फ़ोल्डर को बदलना नहीं चाहेगा, या सर्विस इंस्टॉलेशन के दौरान कार्य फ़ोल्डर सेट करने का कोई तरीका है, ताकि आप सक्षम हैं पूर्ण पथ के बजाय सापेक्ष पथ का उपयोग कर फ़ाइलों/फ़ोल्डरों तक पहुंचने के लिए? मैं अपनी सेवा के साथ एक ही चीज़ देख रहा हूं, जो परीक्षण/डिबगिंग के लिए एक exe के रूप में बहुत अधिक लिखा गया था, फिर एक प्रतीक को परिभाषित करना और संकलन इसे एक सेवा में संकलित करता है, लेकिन यह हमेशा% SYSTEMROOT% \ System32 से बाहर चला रहा है .. – LarryF

+0

@LarryF: मुझे किसी सेवा के लिए उपयोग की जाने वाली कार्यशील निर्देशिका को बदलने के किसी भी तरीके से नहीं पता, नहीं। इसका मतलब यह नहीं है कि ऐसा करने का कोई तरीका नहीं है, लेकिन मुझे एक के बारे में पता नहीं है। –

2

InstallUtil.exe इंस्टॉल समय पर आपके आवेदन के ServiceInstaller.Install() पर कॉल करता है।

इसे ओवरराइड करें, इसे अपनी परियोजना के Installers की सूची में जोड़ें और आपको आवश्यक जानकारी प्राप्त करें।

+0

धन्यवाद। जॉन और स्टीव के रनटाइम दृष्टिकोण वास्तव में मुझे जो करना है उसके लिए एक बेहतर फिट है। – endian

5

मैं Directory.SetCurrentDirectory विधि में पता नहीं था। आमतौर पर मैं करता हूं:

Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory; 
3

हालांकि बहुत देर हो चुकी है, लेकिन यह किसी की मदद कर सकती है। \ Windows \ system32 \ पथ: मैं AppDomain.CurrentDomain.BaseDirectory

string someFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Resources\SomeResource.xml"; 

का उपयोग कर AppDomain.CurrentDomain.BaseDirectory निर्देशिका जहां खिड़कियों सेवा वास्तव में isntalled किया गया था, सी नहीं दिया करके इस समस्या को हल किया।

मैंने इसे बाद में देखा कि @ रैमन पहले से ही एक ही समाधान पोस्ट कर चुका है।

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