2010-02-11 13 views
11

मैंने एक विंडोज सेवा लिखी है, जिसमें से मैं प्रति ग्राहक 1 उदाहरण चलाना चाहता हूं। ऐसा इसलिए है क्योंकि ग्राहकों के पास समान स्कीमा के साथ अपना स्वयं का डीबी होता है; विंडोज सेवाओं के बीच एकमात्र अंतर यह है कि उनके पास ग्राहक डीबी से संबंधित एक अलग पैरामीटर होगा जो उन्हें सेवा के लिए नामित किया गया है। (और मेरे पास एकाधिक कार्यकर्ता धागे के साथ एक सेवा नहीं हो सकती है, क्योंकि डीबी कनेक्शन एक स्थिर चर का उपयोग करता है, जिसे मैं धागे के साथ नहीं बदल सकता।)पैरामीटर के साथ विंडोज सेवा कैसे बनाएं?

मुझे विंडोज सेवा बनाने के तरीके के बारे में this neat little tutorial मिला, लेकिन यह केवल मुझे दिखाता है कि इसे एक ही सेवा के लिए कैसे सेट अप करें। मैं सेवा के उदाहरण n सेट अप करना चाहता हूं, प्रत्येक एक डिस्प्ले नाम वाला जिसमें ग्राहक नाम शामिल है, जो कमांड लाइन पैरामीटर के साथ चल रहा है जो ग्राहक आईडी को दर्शाता है।

ट्यूटोरियल ऊपर लिंक एक वर्ग, MyWindowsServiceInstaller कहा जाता है जो स्थानीय सिस्टम पर खिड़कियों सेवा को स्थापित करता है, और मेरा अनुमान है कि यह मेरी सभी ग्राहकों के माध्यम से एक foreach पाश स्थापित करने के लिए एक तार्किक जगह हो सकता है, एक सेवा की स्थापना प्रत्येक के लिए। लेकिन मैं इंटरफेस पर कहीं भी नहीं देख सकता जो मुझे नई सेवा के लिए कमांड लाइन पैरामीटर सेट करने की अनुमति देगा।

आप यह कैसे करते हैं?

+0

मैं अपने जवाब को हटाने कर रहा हूँ में समाधान नहीं मिला, वहाँ लोगों की तुलना में इस बारे में अधिक पता है वहाँ बाहर मुझे। –

+0

@ बाइनरी वर्रियर - मेरी इच्छा है कि आपने अपना जवाब नहीं हटाया है! वहां कुछ विचार थे जो बहुत ही आशाजनक थे ... –

+0

उत्तर पूर्ववत: मैंने इसे सीडब्ल्यू के रूप में चिह्नित किया है, यह अपूर्ण है, हमारे पास एक ही सेवा चलाने के कई उदाहरण प्राप्त करने के लिए "कैसे करें" निर्देशों के साथ कहीं धोखा शीट है, लेकिन मुझे यह नहीं मिल रहा है और खोदने का समय नहीं है, माफ करना शॉल। –

उत्तर

7

कैसे एक बॉक्स पर एक खिड़कियों सेवा के कई उदाहरण स्थापित करने के लिए के बारे में Wil Peck wrote a good article।मूल विचार यह है कि आपको इंस्टॉलर को यह सोचने की ज़रूरत है कि वे अलग-अलग नाम देकर अलग-अलग सेवाएं हैं।

ऐसा कहकर, ऐसा लगता है कि यह आपके डेटाबेस कनेक्शन कोड को फिर से डिजाइन करने के लिए आसान (और अधिक रखरखाव योग्य) होगा ताकि यह एकाधिक कार्यकर्ता धागे का समर्थन कर सके।

+1

+1, एक सेवा में कई कार्यकर्ता धागे रखने की सलाह के लिए मैं फिर से +1 कर सकता हूं। आप हमेशा एक जीयूआई कर सकते हैं जो सेवा को रिमोट करता है और चल रहे थ्रेड पर जानकारी दिखाता है। –

+0

यूप, विल का जवाब है। पॉइंटर के लिए धन्यवाद एक टन! –

1

आपको मूल रूप से सेवा को कई बार स्थापित करने की आवश्यकता है, और इसे exe.config फ़ाइल के साथ अनुकूलित करें।

वैकल्पिक रूप से, आपके पास एक सेवा हो सकती है जो प्रत्येक ग्राहक के लिए अलग-अलग कार्यकर्ता धागे चलाती है।

अद्यतन

exe.Config एक Application Configuration File

मुझे पता नहीं है कि कैसे सेवा के कई उदाहरण स्थापित करने के लिए है कि इंस्टॉलर घटक का उपयोग करने के लिए है, मुझे पता है आप कर सकते थे नहीं था।

जहां हमें एक मशीन पर चलाने के लिए हमारी सेवाओं में से किसी एक के कई उदाहरणों की आवश्यकता होती है, हम वास्तव में इसे केवल एक बार इंस्टॉल करते हैं, फिर सचमुच इंस्टॉल किए गए फ़ोल्डर की प्रतिलिपि बनाते हैं और दूसरे उदाहरण के लिए exe नाम बदलते हैं। दूसरा उदाहरण उसके बाद अपने स्वयं के अनुप्रयोग कॉन्फ़िगरेशन फ़ाइल में कॉन्फ़िगर किया गया है।

+0

उपरोक्त से जुड़े ट्यूटोरियल में, MyWindowsServiceInstaller नामक एक कक्षा है, जो स्थापना कार्य करता है। ऐसा लगता है कि सभी ग्राहकों के लिए एक लूप स्थापित करने का स्थान होना चाहिए - लेकिन मैं प्रत्येक सेवा के लिए कमांड लाइन पैरामीटर सेट अप करने के लिए कहीं भी नहीं देख सकता। आप पैरामीटर कैसे सेट अप करते हैं? और मेरी अज्ञानता क्षमा करें, लेकिन exe.config क्या है? –

+0

ने आपके द्वारा उल्लिखित कुछ बिंदुओं को स्पष्ट करने के लिए अपना प्रश्न अपडेट कर दिया है। –

+0

ऐप कॉन्फ़िगर फ़ाइल –

1

जहां तक ​​मुझे पता है कि ServiceInstaller, ServiceProcessInstaller या installutil का उपयोग करके स्टार्टअप पैरामीटर प्रदान करना असंभव है। हालांकि, advapi.dll से कुछ COM api का उपयोग करके स्टार्टअप पैरामीटर प्रदान करना संभव है (बाएं मेनू की जांच करें)। आवश्यक कॉल का पूरा संग्रह here पाया जा सकता है। यह एक वर्ग (भी) है जिसे ServiceInstaller कहा जाता है जिसमें आवश्यक बाह्य विधियां और कुछ उपयोगिता विधियां होती हैं।

आप उपयोगिता विधि InstallAndStart का उपयोग करना चाहते हैं। यह एक सेवा नाम, एक प्रदर्शन नाम और निष्पादन योग्य के लिए एक मार्ग स्वीकार करता है जो आपकी विंडोज सेवा का प्रतिनिधित्व करता है। आप इसे इस तरह कॉल कर सकते हैं:

InstallAndStart("MyService", "My Service For User 1", 
       "c:\\pathtoexe\MyService.exe user1"); 

आप निम्न सेवा है, तो पैरामीटर startupParam मूल्य user1 प्राप्त होगा।

class Program : ServiceBase 
{ 
    private string startupParam; 

    static void Main(string[] args) 
    { 
     string arg = args[0]; 
     ServiceBase.Run(new Program(arg)); 
    } 

    public Program(string startupParam) 
    { 
     this.ServiceName = "MyService"; 
     this.startupParam = startupParam; 
    } 
    ... 
} 
+0

ummm के लिंक के लिए +1 ... बस यह कोशिश की, और ऐसा लगता है कि इंस्टॉलटिल आपको पैरामीटर पास करने की अनुमति नहीं देता है ...? क्या मैं कुछ भूल रहा हूँ? –

+0

एचएम, लगता है कि मैं सही नहीं हूँ। इसके लिए खेद है और installutil भाग के बारे में भूल जाओ। मैं एक कस्टम सर्विस इंस्टालर क्लास का उपयोग करता हूं जो सेवाओं को शुरू करने और रोकने के लिए COM api का उपयोग करता है। यह वर्ग गुजरने वाले पैरामीटर की अनुमति देता है और मैंने सोचा कि इंस्टॉल्यूटिल वही करेगा। मैं अपना जवाब अपडेट करूंगा ... –

+0

रोनाल्ड, मेरे पास एक क्लाइंट है जिसे सिस्टम खाते का उपयोग कर सिस्टम पर कार्रवाई करने के लिए विंडोज सेवा की आवश्यकता है, क्योंकि मेरे क्लाइंट को अनुमति नहीं है। यदि मैं क्लाइंट को विंडोज सेवा को बताना चाहता हूं कि क्या करना है, तो क्या मुझे इस तरह के तर्क पारित करके हर बार रोकना और शुरू करना चाहिए? मुझे OnCustomCommand सुविधा मिली, लेकिन यह उपयोगी नहीं है क्योंकि आप केवल पूर्णांक पास कर सकते हैं। या क्या मुझे अस्थायी रूप से चल रहे क्लाइंट के आधार पर तर्क सेट करने के लिए डेटाबेस या रजिस्ट्री कुंजियों का उपयोग करना चाहिए? – MacGyver

-2

यदि तृतीय पक्ष टूल का उपयोग करना आपके साथ ठीक है, तो http://installer.codeeffects.com आज़माएं। वे आपको अपनी विंडोज सेवा के लिए एक .exe इंस्टॉलर बनाने और इंस्टॉलर के यूआई में पैरामीटर जोड़ने देते हैं। इसके अलावा, आपको अपनी खुद की सेटअप परियोजना विकसित करने की आवश्यकता नहीं है। उम्मीद है की यह मदद करेगा।

+0

$ पिंग installer.codeeffects.com पिंग: installer.codeeffects.com को हल नहीं कर सकता: अज्ञात होस्ट – harperville

12

मैं चाहता था कि मैंने जो सेवा बनाई है, उसे एक पैरामीटर भेजना था। जैसा कि यह निकला है, आपको केवल इतना करना है (ध्यान से!) रजिस्ट्री को HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ पर संपादित करें और उद्धरण के बाद, ImagePath में पैरामीटर जोड़ें।

ईजी। ImagePath मान डेटा: "C: \ Program Files \ MyService \ MyService.exe" param1

मैं इस लिंक http://social.msdn.microsoft.com/Forums/is/csharpgeneral/thread/38242afa-7e40-4c06-975e-aa97d3cc782f

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