Visual Studio में बनाई गई Windows सेवा स्थापित करें


136

जब मैं Visual Studio 2010 में एक नई Windows सेवा बनाता हूं, तो मुझे सेवा चलाने के लिए InstallUtil और net start का उपयोग करने का संदेश मिलता है।

मैंने निम्नलिखित चरणों की कोशिश की है:

  1. नई परियोजना फ़ाइल बनाएँ -> नई -> परियोजना -> विंडोज सेवा
  2. प्रोजेक्ट का नाम: TestService
  3. (जैसा कि Service1 कंस्ट्रक्टर, OnStart, OnStop) प्रोजेक्ट बनाएँ
  4. ओपन कमांड प्रॉम्प्ट, "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe" चलाएँ
  5. नेट स्टार्ट टेस्ट सेवा को चलाएं ।

चरण 4 का आउटपुट

एक संस्थापित संस्थापन चल रहा है।

स्थापना के चरण चरण की शुरुआत।

C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe असेंबली की प्रगति के लिए लॉग फ़ाइल की सामग्री देखें।

फ़ाइल C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog पर स्थित है।

असेंबली 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Test \ ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe' स्थापित करना।

प्रभावित पैरामीटर हैं:

logtoconsole =

logfile = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog

असेम्बलीथ = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ बर्फ \ TestService \ obj \ x86 \ Debug \ TestService.exe

RunInstallerAttribute.Yes विशेषता वाला कोई भी सार्वजनिक इंस्टॉलर C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj 'x86 \ Debug \ TestService.exe असेंबली में नहीं पाया जा सका।

स्थापित चरण सफलतापूर्वक पूरा हुआ, और कमिट चरण शुरू हो रहा है।

C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe असेंबली की प्रगति के लिए लॉग फ़ाइल की सामग्री देखें।

फ़ाइल C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog पर स्थित है।

विधानसभा 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'।

प्रभावित पैरामीटर हैं:

logtoconsole =

logfile = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog

असेम्बलीथ = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ बर्फ \ TestService \ obj \ x86 \ Debug \ TestService.exe

RunInstallerAttribute.Yes विशेषता वाला कोई भी सार्वजनिक इंस्टॉलर C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj 'x86 \ Debug \ TestService.exe असेंबली में नहीं पाया जा सका।

InstallState फ़ाइल को निकालें क्योंकि कोई इंस्टॉलर नहीं हैं।

प्रतिबद्ध चरण सफलतापूर्वक पूरा हुआ।

लेन-देन स्थापित पूरा हो गया है।

चरण 5 का आउटपुट

सेवा का नाम अमान्य है।

NET HELPMSG 2185 लिखकर अधिक मदद उपलब्ध है।

जवाबों:


243

आपको डिज़ाइनर में Service.cs फ़ाइल खोलने की आवश्यकता है, इसे राइट क्लिक करें और मेनू-विकल्प "इंस्टॉलर जोड़ें" चुनें।

यह बॉक्स के ठीक बाहर स्थापित नहीं होगा ... आपको पहले इंस्टॉलर वर्ग बनाने की आवश्यकता है।

सेवा इंस्टॉलर पर कुछ संदर्भ:

कैसे करें: अपने सेवा आवेदन में इंस्टॉलर जोड़ें

काफी पुराना ... लेकिन यह मैं किस बारे में बात कर रहा हूं:

Windows सेवाएँ C # में: इंस्टॉलर को जोड़ना (भाग 3)

ऐसा करने से ProjectInstaller.csवसीयत स्वत: निर्मित हो जाएगी। फिर आप इस पर डबल क्लिक कर सकते हैं, डिज़ाइनर को एंटर कर सकते हैं और घटकों को कॉन्फ़िगर कर सकते हैं:

  • serviceInstaller1सेवा के ही गुण है: Description, DisplayName, ServiceNameऔर StartTypeसबसे महत्वपूर्ण हैं।

  • serviceProcessInstaller1यह महत्वपूर्ण संपत्ति है: Accountयह वह खाता है जिसमें सेवा चलेगी।

उदाहरण के लिए:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

3
इंस्टॉलर को जोड़ना और स्थानीय सिस्टम में खाता सेट करना। धन्यवाद!
ल्यूक

1
मुझे वही त्रुटि VS2013 में मिल रही है। मैंने आपके द्वारा प्रदत्त लिंक की जाँच की, सत्यापित किया कि मेरे पास ProjectInstaller है, जिसमें घटक सेवा [प्रक्रिया] Installer1, ठीक से कॉन्फ़िगर किया गया है। मैं इंस्टॉलर के रूप में installutil.exe चलाता हूं। यह अभी भी रिपोर्ट करता है "RunInstallerAttribute.Yes विशेषता के साथ कोई सार्वजनिक इंस्टॉलर नहीं पाया जा सकता है"। कोई विचार?
बैरी डाइएटर

4
जबरदस्त हंसी। मुझे पसंद है कि "काफी पुराना" लिंक आर्कन कोड नामक साइट पर है। वह पेज जितना पुराना होता है, उसका नाम
उतना ही बड़ा

"डिजाइनर" क्या है? जिन अनुप्रयोगों में कोई UI नहीं है, उनमें आमतौर पर ऐसी कोई चीज़ शामिल नहीं होती है जिसे डिज़ाइनर कहा जाएगा
मैक्सक्स

सेवाओं में एक डिज़ाइनर भी होता है, जैसे फॉर्म
ग्रुंगोंडोला

11

देखना:

RunInstallerAttribute.Yes विशेषता वाला कोई भी सार्वजनिक इंस्टॉलर C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj 'x86 \ Debug \ TestService.exe असेंबली में नहीं पाया जा सका।

ऐसा लगता है कि आपके पास अपने कोड में इंस्टॉलर वर्ग नहीं हो सकता है। यह एक ऐसा वर्ग है जो इससे विरासत में मिला Installerहैinstallutil कि एक सेवा के रूप में अपने निष्पादन योग्य को कैसे स्थापित किया जाए।

Ps मेरे पास अपनी स्वयं की छोटी-सी स्थापित / डीबग करने योग्य Windows सेवा टेम्प्लेट है, जिसे आप कोड से या उपयोग से कॉपी कर सकते हैं: डीबग करने योग्य, सेल्फ-इंस्टॉलिंग विंडोज सर्विस


जब मैं Visual Studio -> गुण -> सेवा में TestService प्रोजेक्ट पर राइट क्लिक करता हूं, तो पृष्ठ अक्षम हो जाता है ... क्या आप किसी भिन्न स्थान का संदर्भ दे रहे थे? एप्लिकेशन के तहत, असेंबली का नाम TestService है।
जाख २

@ जॉन: सर्विसेज कंसोल के बारे में पहले भाग को अनदेखा करें, वास्तव में शुरू होने वाले दूसरे भाग को देखें । ऐसा लगता है कि सेवा कभी स्थापित नहीं हुई क्योंकि उसे इंस्टॉलर नहीं मिला।
जेम्स माइकल हरे

8

यहां इंस्टॉलर बनाने और उस त्रुटि संदेश से छुटकारा पाने का एक वैकल्पिक तरीका है। यह भी लगता है कि VS2015 एक्सप्रेस में "इंस्टॉलर जोड़ें" मेनू आइटम नहीं है।

आपको बस एक वर्ग बनाने और नीचे दिए गए कोड को जोड़ने और संदर्भ System.Configuration.Install.dll जोड़ने की आवश्यकता है।

using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;


namespace SAS
{
    [RunInstaller(true)]
    public class MyProjectInstaller : Installer
    {
        private ServiceInstaller serviceInstaller1;
        private ServiceProcessInstaller processInstaller;

        public MyProjectInstaller()
        {
            // Instantiate installer for process and service.
            processInstaller = new ServiceProcessInstaller();
            serviceInstaller1 = new ServiceInstaller();

            // The service runs under the system account.
            processInstaller.Account = ServiceAccount.LocalSystem;

            // The service is started manually.
            serviceInstaller1.StartType = ServiceStartMode.Manual;

            // ServiceName must equal those on ServiceBase derived classes.
            serviceInstaller1.ServiceName = "SAS Service";

            // Add installer to collection. Order is not important if more than one service.
            Installers.Add(serviceInstaller1);
            Installers.Add(processInstaller);
        }
    }
}

साथ ही VS2015 चल रहा है और इस समाधान ने मुझे "RunInstallerAttribute.Yes" त्रुटि संदेश के साथ कोई सार्वजनिक इंस्टालर नहीं मिला, जो मुझे पहले मिल रहा था। धन्यवाद!
PHBeagle

6

दो विशिष्ट समस्याएं:

  1. ProjectInstaller वर्ग गुम (जैसा @MiguelAngelo ने बताया है)
  2. कमांड प्रॉम्प्ट चाहिए "के रूप में चलाने के लिए प्रशासक "

4

एक और संभावित समस्या (जो मैं भाग गया):

सुनिश्चित करें कि ProjectInstallerवर्ग है public। ईमानदार होने के लिए, मुझे यकीन नहीं है कि मैंने वास्तव में यह कैसे किया, लेकिन मैंने इवेंट हैंडलर को जोड़ा ProjectInstaller.Designer.cs, जैसे:

this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

मुझे लगता है कि हैंडलर फ़ंक्शन बनाने की स्वचालित प्रक्रिया के दौरान ProjectInstaller.csइसमें से कक्षा की परिभाषा बदल गई

public class ProjectInstaller : System.Configuration.Install.Installer

सेवा

partial class ProjectInstaller : System.Configuration.Install.Installer

publicकीवर्ड की जगह ले रहा है partial। तो, इसे ठीक करने के लिए यह होना चाहिए

public partial class ProjectInstaller : System.Configuration.Install.Installer

मैं Visual Studio 2013 सामुदायिक संस्करण का उपयोग करता हूं।


मुझे पता है कि यह 3 साल बाद है, लेकिन इससे मेरी समस्या हल हो गई। सुनिश्चित नहीं है कि क्यों या जब डिजाइनर ने पिछले सार्वजनिक आंशिक वर्ग को आंतरिक आंशिक वर्ग में बदल दिया। धन्यवाद!
trashrobber

2

वीएस 2010 और .NET 4.0 और बाद में चुपके परिवर्तन

RunInstallerAttribute.Yes विशेषता के साथ कोई सार्वजनिक इंस्टॉलर नहीं पाया जा सका

.NET में एक अन्य परिवर्तन या कंपाइलर क्लीनअप है जो आपके विशिष्ट मामले के लिए इस छोटे से घुमाव को प्रकट कर सकता है।

यदि आपके पास निम्न कोड है ...

RunInstaller(true)   // old alias  

आपको इसे अपडेट करने की आवश्यकता हो सकती है

RunInstallerAttribute(true)  // new property spelling

यह संकलन के समय या रनटाइम के तहत कवर किए गए उपनाम की तरह है और आपको यह त्रुटि व्यवहार मिलेगा। RunInstallerAttribute (सच) में उपरोक्त स्पष्ट परिवर्तन ने इसे सभी मशीनों में हमारे सभी स्थापित परिदृश्यों में तय किया।

जब आप प्रोजेक्ट या सेवा इंस्टॉलर जोड़ते हैं, तब "पुराने" RunInstaller (सत्य) के लिए जाँच करें और इसे नए RunInstallerAttribute (सत्य) में बदलें


मेरे ज्ञान के अनुसार आप "गुण" उपसर्ग को छोड़ सकते हैं, अर्थात [RunInstaller (true)] और [RunInstallerAttribute (सत्य)] एक ही है। इसे एक अलग विशेषता के साथ आज़माएँ, जैसे [DebuggerStepThrough ()] और [DebuggerStepThroughAttribute ()] - दोनों तब काम करेंगे जब एक कक्षा में लागू किया जाएगा।
मैट

1

फिर भी एक और कैच मैं भागा: सुनिश्चित करें कि आपका इंस्टॉलर व्युत्पन्न वर्ग (आमतौर पर ProjectInstaller) नेमस्पेस पदानुक्रम के शीर्ष पर है, मैंने एक सार्वजनिक वर्ग को किसी अन्य सार्वजनिक वर्ग के भीतर उपयोग करने की कोशिश की, लेकिन यह उसी पुरानी त्रुटि का परिणाम है:

RunInstallerAttribute.Yes विशेषता के साथ कोई सार्वजनिक इंस्टॉलर नहीं पाया जा सका

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.