2010-09-17 20 views
9

के रूप में एक WPF एप्लिकेशन चलाएं हम एक विंडोज प्रेजेंटेशन फाउंडेशन एप्लिकेशन विकसित कर रहे हैं जिसे हम विंडोज सेवा के रूप में चलाने में सक्षम होना चाहते हैं।विंडोज सेवा

किसी ने ऐसा कुछ किया है?
क्या यह संभव है?

हमें डेस्कटॉप या किसी भी जीयूआई से बातचीत करने की आवश्यकता नहीं है, यह एक ऐप रखना अच्छा होगा कि हम कमांड लाइन (जो काम करता है) या सेवा के रूप में एक जीयूआई के साथ दौड़ सकते हैं।

अंगूठे सेवाओं की एक नियम के रूप में :-)

उत्तर

12

दिलचस्प इनपुट की ओर देख रहे यूआई के किसी भी प्रकार कभी नहीं होना चाहिए। ऐसा इसलिए होता है क्योंकि सेवाएं आमतौर पर बहुत अधिक विशेषाधिकारों के साथ चलती हैं और यदि आप अपने इनपुट से सावधान नहीं हैं तो बुरी चीजें हो सकती हैं। (मुझे लगता है कि विंडोज के नवीनतम संस्करण आपको एक सेवा से यूआई बनाने की अनुमति नहीं देंगे, लेकिन मैं 100% निश्चित नहीं हूं।)

यदि आपको किसी सेवा के साथ संवाद करने की आवश्यकता है, तो आपको कुछ प्रकार के आईपीसी का उपयोग करना चाहिए (डब्ल्यूसीएफ, पाइप, सॉकेट,   ...)। आप एक सरल सांत्वना कार्यक्रम है कि यह भी एक सेवा हो सकता है चाहते हैं, मुझे लगता है कि सेट करने के लिए एक चाल के बारे में पता:

class MyExampleApp : ServiceBase 
{ 
    public static void Main(string[] args) 
    { 
     if (args.Length == 1 && args[0].Equals("--console")) 
     { 
      new MyExampleApp().ConsoleRun(); 
     } 
     else 
     { 
      ServiceBase.Run(new MyExampleApp()); 
     } 
    } 
    private void ConsoleRun() 
    { 
     Console.WriteLine(string.Format("{0}::starting...", GetType().FullName)); 

     OnStart(null); 

     Console.WriteLine(string.Format("{0}::ready (ENTER to exit)", GetType().FullName)); 
     Console.ReadLine(); 

     OnStop(); 

     Console.WriteLine(string.Format("{0}::stopped", GetType().FullName)); 
    } 
    //snip 
} 

तुम सिर्फ कार्यक्रम शुरू करते हैं, तो यह एक सेवा के रूप शुभारंभ करेंगे (और यदि आप पर चिल्लाना आप इसे कंसोल से चलाते हैं), लेकिन अगर आप इसे शुरू करते समय पैरामीटर --console जोड़ते हैं, तो प्रोग्राम लॉन्च होगा और आपके पास बंद करने के लिए एंटर दबाएगा।

+0

यह सीएलआई और सेवा के लिए ठीक है। –

+0

कोड के लिए धन्यवाद। ऑनस्टॉप भाग को समझने के लिए सेवा सामग्री में थोड़ा गहरा खोदना है। – Remy

0

यदि आपके पास पहले से ही कमांड लाइन से काम कर रहा है तो आप वहां आधे रास्ते हैं। कुछ ऐप्स में केवल सरल ध्वज पदनाम होते हैं जिनका उपयोग आप ऐप को सेवा के रूप में चलाने के लिए करते हैं, इन झंडे की जांच करें और तदनुसार अपना तर्क प्रवाह करें। कुछ ऐसा:

myapp.exe --runservice 
+0

कोई बुरा सलाह नहीं है, लेकिन मुझे लगता है कि सीएलआई डिफ़ॉल्ट रूप से सेवा के रूप में चलाने के लिए आमतौर पर बेहतर होता है। यह सेटअप को सरल बनाता है। –

3

ऐसा मत करो। एक इंजन असेंबली में सभी गड़बड़ लिखें, फिर इसे जीयूआई और सेवा से संदर्भित करें। सीएलआई या तो तीसरा निष्पादन योग्य हो सकता है, या निष्पादन योग्य सेवा का पुन: उपयोग किया जा सकता है। कुंजी यह है कि सेवा को WPF या WinForms या जो भी GUI ढांचा आप उपयोग करते हैं, उसके संदर्भ के बिना चलाने की अनुमति दें।

+0

मैं इसके बारे में भी सोच रहा था। एक resonable समाधान की तरह लगता है। लेकिन डब्ल्यूपीएफ या विनफॉर्म का संदर्भ खराब क्यों है? जब तक यह सिर्फ एक संदर्भ है? – Remy

+0

@Remy: एक स्थिर संदर्भ शुरुआत में असेंबली लोड करता है। –

0

मेरे समाधान एक मुख्य प्रवेश समारोह जोड़ने के लिए, की तरह है:

public static void Main() 
{ 
    ServiceBase.Run(new MyService()); 
} 

अब हमारे पास दो एप्लिकेशन स्टार्टअप प्रविष्टि, WPF के लिए एक, Windows सेवा के लिए एक;

हम विजुअल स्टूडियो -> प्रोजेक्ट प्रॉपर्टी -> एप्लिकेशन -> स्टार्टअप ऑब्जेक्ट में स्टार्टअप ऑब्जेक्ट को कॉन्फ़िगर कर सकते हैं।

तो प्रवेश और पुनर्निर्माण की सेटिंग, आप जो चाहते हैं उसे प्राप्त करेंगे।