2008-10-01 28 views
6

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

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

जब मैं खिड़कियों सेवा से प्रपत्र शुरू कर दिया, कुछ नहीं हुआ:

यहाँ समस्या है। चारों ओर घूमते हुए मैंने पाया है कि मुझे सेवा पर राइट क्लिक करना है, लॉग ऑन पर जाना है और "डेस्कटॉप के साथ बातचीत करने की अनुमति दें" विकल्प को चेक करें। चूंकि मैं अपने उपयोगकर्ताओं से ऐसा नहीं करना चाहता हूं, इसलिए मुझे इंस्टॉलेशन समय के दौरान उपयोगकर्ता के regedit में इस विकल्प को सेट करने के लिए फिर से कुछ कोड googling मिला। समस्या यह है कि इस विकल्प को भी सेट करना, यह काम नहीं करता है। मुझे सेवा के लॉग ऑन विकल्प खोलना है (यह चेक किया गया है), अनचेक करें और फिर से जांचें।

तो, इसे कैसे हल करें? किसी भी उपयोगकर्ता में लॉग इन करने के लिए उपलब्ध एक ही प्रक्रिया में एक सिस्ट्रे नियंत्रण के साथ विंडोज सेवा रखने का सबसे अच्छा तरीका कैसा है?

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

+0

"मैं अपने सेवा के साथ कि युग्मन यूआई पता समझाने अपने सॉफ़्टवेयर टूट जाएगा, और शायद मेरे उपयोगकर्ताओं कंप्यूटर एक बेहतर उदाहरण के लिए [email protected] है, लेकिन मैं चाहता हूँ वैसे भी ऐसा करने के लिए। " 3 या 4 कदम वापस लें और फिर से मूल्यांकन करें यदि आपको वह करना चाहिए जो आप करने की कोशिश कर रहे हैं। क्या यह भी समझ में आता है? –

+2

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

उत्तर

18

दो अलग-अलग प्रक्रियाएं जो आपकी पसंद की तकनीक का उपयोग करके संवाद करती हैं। यूआई के साथ सेवाएं खराब विचार है। इस सड़क पर मत जाओ - आपको पछतावा होगा।

मेरे पास एक साधारण सॉकेट कनेक्शन के माध्यम से सेवा संचार होने के बहुत अच्छे परिणाम हैं - अपने सेवा प्रोटोकॉल को अच्छी तरह से दस्तावेज करें, इसे यथासंभव सरल रखें, और यह आपके विचार से आसान होगा।

+1

मैं पूरी तरह से इस से सहमत हूं। यदि संभव हो तो मैं कुछ संचार विधि को देखूंगा जैसा कि रिमोटिंग के रूप में नहीं किया गया है। सॉकेट, पाइप, आदि – mattlant

+1

@andrecarlucci: जब हम यूआई के साथ सेवाओं के बारे में बात करते हैं, तो यह "व्यक्तिगत वरीयता" नहीं है, यह वास्तुशिल्प तथ्य है। टीसीपी/आईपी सॉकेट के साथ जाकर और एक सरल, अच्छी तरह से प्रलेखित प्रोटोकॉल उसी प्रक्रिया में सेवा + यूआई से जुड़े मुद्दों के बिना, यहां से वहां पहुंचने का आपका सबसे अच्छा तरीका होगा। –

+0

हाय सब। मैं आप सभी से सहमत हूं। डॉटनेट रीमोटिंग बस यही है। लेकिन यह सवाल नहीं है, सवाल यह है कि उसी प्रक्रिया में ऐसा करने का सबसे अच्छा तरीका कैसा है और सबसे अच्छा तरीका नहीं है। मैं अपने अपडेट को दोबारा बदल दूंगा, इसलिए यह अशिष्ट नहीं लगता है, इसके बारे में खेद है। – andrecarlucci

1

प्रैक्टिस में आपको प्रबंधन UI के साथ अपनी सेवा को जोड़े नहीं जाना चाहिए।

1

मैं ग्रेग से सहमत हूं। शायद आप एक अलग आईपीसी तंत्र की जांच कर सकते हैं। शायद सॉकेट और अपने प्रोटोकॉल का उपयोग करें। या, यदि आपका सेवा नियंत्रण ऐप केवल स्थानीय मशीन पर सेवा को नियंत्रित कर सकता है, तो आप नामित पाइप (यहां तक ​​कि तेज़) का उपयोग कर सकते हैं।

0

यह बहुत आसान है - एप्लिकेशन ईवेंट करने के लिए एक थ्रेड बनाने की आपकी आवश्यकता है। इस तरह (सी ++ CLR के साथ के लिए स्रोत कोड है, लेकिन अपने सी # में यह कर सकते हैं): मुख्य

int main(array<System::String ^> ^args) 
{ 
    bool bService = RunAsService(L"SimpleServiceWithIconInTrayAndWindow"); 

    if (bService) 
    { 

     System::Threading::Thread ^thread = gcnew System::Threading::Thread(gcnew ParameterizedThreadStart(RunWindow::MakeWindow)); 
     thread->Start(); 

     ServiceBase::Run(gcnew simpleWinService()); 
     Application::Exit(); 
    } 
    else 
    { 
     Application::EnableVisualStyles(); 
     Application::SetCompatibleTextRenderingDefault(false); 

     // Create the main window and run it 
     Application::Run(gcnew TMainForm()); 
    } 

    return 0; 
} 
0

में

ref class RunWindow{ 
public: 
    static void MakeWindow(Object^ data) 
    { 
     Application::EnableVisualStyles(); 
     Application::SetCompatibleTextRenderingDefault(false); 

     Application::Run(gcnew TMainForm()); 
    }; 
}; 

और बनाने धागा इंटरैक्टिव सेवाओं के साथ मुख्य समस्याएं हैं:

  • सुरक्षा - अन्य प्रक्रिया इसे संदेश संदेश पंप के माध्यम से संदेश भेज सकती है, जिससे सिस्टम/स्थानीय प्रक्रिया तक पहुंच प्राप्त हो जाती है।

  • अपूर्णता - एक इंटरैक्टिव सेवा कभी भी शेल संदेशों को नहीं देखती है, इसलिए यह अधिसूचना क्षेत्र आइकन से बातचीत नहीं कर सकती है।

हम नियमित रूप से उपयोग TCP और UDP कनेक्शन, कुछ मामलों में अन्य व्यय के लिए सेवाओं से जानकारी पारित करने के लिए, और, MSMQ।

1

मैं पता लगा कि कैसे this article से यह करने के लिए (तरीके तालिका में "बदलें" लिंक पर क्लिक करें)।

string wmiPath = "Win32_Service.Name='" + SERVICE_NAME + "'"; 
using (ManagementObject service = new ManagementObject(wmiPath)) 
{ 
    object[] parameters = new object[11]; 
    parameters[5] = true; // Enable desktop interaction 
    service.InvokeMethod("Change", parameters); 
} 
+0

हाँ, मैंने आपका कोड यहां उपयोग किया है, और यह काम करता है। लेकिन मैंने नया कंसोल ऐप बनाया जो सेवा स्थापना समाप्त होने के बाद चलाया जाता है ... इसलिए, अगर किसी ने इसे 'ऑनस्टार्ट()' में कहीं भी रखने की कोशिश की है तो यह ऐसा काम नहीं करता है। – Cipi

+0

और आप शायद इसे संपादित करना और जोड़ना चाहते हैं: 'पैरामीटर [6] = "लोकलसिस्टम"; पैरामीटर [7] = ""; "इसलिए लॉगऑन स्थानीय सिस्टम खाते के रूप में चुना जाता है। ;) – Cipi

+0

मान लीजिए कि आप स्थानीय सिस्टम खाते चाहते हैं। ज्यादातर समय मुझे लगता है कि लोग स्थानीय सिस्टम को सुनिश्चित करने के बजाय खाते को समान रखना चाहते हैं। – Phil

1

मैं कुछ चरणों में समाधान है, इस योजना

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

  2. विचार यह है कि डेटाबेस या फ़ाइल या डेटा को संग्रहीत करने के साथ आप जो कुछ भी सहज रखते हैं, उसमें डेटा रखना है जिसमें आप पैरामीटर को स्टोर करेंगे, जो आपकी विंडोज सेवा हमेशा चलाने के लिए उपयोग की जाएगी। तो आपकी विंडोज़ सेवा और आपके विंडोज़ फॉर्म एप्लिकेशन को डेटा को संशोधित और पुनर्प्राप्त करने में सक्षम होना चाहिए।

  3. अपने विंडोज़ एप्लिकेशन के मुख्य रूप में फॉर्म पर एक नोटिफ़िकॉन ड्रैग और ड्रॉप करें, गुण टैब में ब्राउज़ करें और एक .ico छवि चुनें (आप विजुअल स्टूडियो में से एक को सता सकते हैं लेकिन यह एक और विषय है जिसे आप प्राप्त कर सकते हैं Google पर या मुझसे संपर्क करें) जब आप एप्लिकेशन चलाते हैं तो यह सिस्टम ट्रे में प्रदर्शित होगा और मुख्य फ़ॉर्म सक्रिय है या दिखाया गया है, इसे आज़माएं, एप्लिकेशन चलाएं।

  4. दोनों को समाधान की सेटअप प्रोजेक्ट में आउटपुट के रूप में जोड़ें। एक सेटअप परियोजना में एक परियोजना जोड़ने के लिए वे एक ही समाधान में होना चाहिए। समाधान एक्सप्लोरर में सेटअप प्रोजेक्ट पर राइट क्लिक करें, हाइलाइट जोड़ें और फिर प्रोजेक्ट आउटपुट का चयन करें, विंडोज सर्विस और विंडोज फॉर्म आउटपुट जोड़ें और आप उन्हें सेटअप प्रोजेक्ट के तहत समाधान एक्सप्लोरर में देखेंगे।

  5. एक खिड़कियों सेवा को जोड़ने के इस लेकिन उससे आगे जाता है भी एक अन्य विषय गूगल यह

  6. विंडोज़ अनुप्रयोग के लिए शॉर्टकट बनाना और स्टार्टअप फ़ोल्डर में जोड़ने से भी एक अन्य विषय गूगल है या मुझसे संपर्क है।

    नोट अपने फॉर्म को इस तरह से प्रोग्राम करें कि बंद बटन नहीं दिखाता है और फॉर्म मुझे जाता है। दृश्यमान = गलत और सिस्टम ट्रे में आइकन पर डबल क्लिक करना मुझे सेट करने का एकमात्र तरीका है। दृश्यमान = सत्य। इस तरह से जब भी कंप्यूटर शुरू होता है, तो आपके विंडोज़ फॉर्म एप्लिकेशन को भी शुरू किया जाता है और दृश्यमान तुरंत झूठी पर सेट होता है लेकिन चूंकि इसमें आइकन छवि के साथ एक अधिसूचना है, यह सिस्टम ट्रे में दिखाएगा और डबल क्लिक करने से फ़ॉर्म को संपादित करने के लिए दृश्यमान बनाया जाएगा सेटिंग्स जो आप सेवा के लिए संग्रहीत कर रहे हैं, सेवा स्वचालित रूप से भी शुरू होती है क्योंकि आप इसे सेटअप प्रोजेक्ट में सेवा सेट अप करने के लिए सेट करते हैं। अपने मेल स्क्रीन शॉट्स का उपयोग कर और में पूर्ण

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