2010-11-10 11 views
35

में स्वयं स्थापित विंडोज सेवा मैंने इस प्रश्न को Inno Setup for Windows service? पढ़ा है। मेरे पास एक ही समस्या है, लेकिन मैं लुबोस हैस्को से जवाब को समझ नहीं पा रहा हूं। मैं इसे कैसे कर सकता हूं? क्या आप मुझे पूर्ण walkthrough पोस्ट कर सकते हैं?.NET C#

जब मैं नीचे कोड चलाता हूं, कुछ स्थापित होता है, लेकिन सेवा की सूची में, मुझे यह नहीं मिला। मैं इस किया है, लेकिन यह काम नहीं:

using System; 
using System.Collections.Generic; 
using System.Configuration.Install; 
using System.Linq; 
using System.Reflection; 
using System.ServiceProcess; 
using System.Text; 
using System.IO; 

namespace ConsoleApplication1 
{ 

public class Service1 : ServiceBase 
{ 

    public Service1() 
    { 
     File.AppendAllText("sss.txt", "ccccc"); 
    } 

    protected override void OnStart(string[] args) 
    { 
     File.AppendAllText("sss.txt", "asdfasdf"); 
    } 

    protected override void OnStop() 
    { 
     File.AppendAllText("sss.txt", "bbbbb"); 
    } 


    static void Main(string[] args) 
    { 
     if (System.Environment.UserInteractive) 
     { 
      string parameter = string.Concat(args); 
      switch (parameter) 
      { 
       case "--install": 
        ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location }); 
        break; 
       case "--uninstall": 
        ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location }); 
        break; 
      } 
     } 
     else 
     { 
      ServiceBase.Run(new Service1()); 
     } 


     Console.ReadKey(); 
    } 
} 
} 

मैं इस understad न या तो:

if (System.Environment.UserInteractive) ... 

उत्तर

72

यह मेरा पूरा समाधान है, और यह काम करता है। यह मूल रूप से वही उत्तर है जैसे this प्रश्न।

using System; 
using System.Configuration.Install; 
using System.Reflection; 
using System.ServiceProcess; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program : ServiceBase 
    { 
     static void Main(string[] args) 
     { 

      AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 


      if (System.Environment.UserInteractive) 
      { 
       string parameter = string.Concat(args); 
       switch (parameter) 
       { 
        case "--install": 
         ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location }); 
         break; 
        case "--uninstall": 
         ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location }); 
         break; 
       } 
      } 
      else 
      { 
       ServiceBase.Run(new Program()); 
      } 



     } 

     private static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      File.AppendAllText(@"C:\Temp\error.txt", ((Exception)e.ExceptionObject).Message + ((Exception)e.ExceptionObject).InnerException.Message); 
     } 

     public Program() 
     { 
      this.ServiceName = "My Service"; 
      File.AppendAllText(@"C:\Temp\sss.txt", "aaa"); 

     } 

     protected override void OnStart(string[] args) 
     { 
      base.OnStart(args); 

      File.AppendAllText(@"C:\Temp\sss.txt", "bbb"); 
     } 

     protected override void OnStop() 
     { 
      base.OnStop(); 

      File.AppendAllText(@"C:\Temp\sss.txt", "ccc"); 
     } 
    } 
} 

और एक ही परियोजना में इस वर्ग बनाने के लिए:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Configuration.Install; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    [RunInstaller(true)] 
    public class MyWindowsServiceInstaller : Installer 
    { 
     public MyWindowsServiceInstaller() 
     { 
      var processInstaller = new ServiceProcessInstaller(); 
      var serviceInstaller = new ServiceInstaller(); 

      //set the privileges 
      processInstaller.Account = ServiceAccount.LocalSystem; 

      serviceInstaller.DisplayName = "My Service"; 
      serviceInstaller.StartType = ServiceStartMode.Automatic; 

      //must be the same as what was set in Program's constructor 
      serviceInstaller.ServiceName = "My Service"; 
      this.Installers.Add(processInstaller); 
      this.Installers.Add(serviceInstaller); 
     } 
    } 
} 

भागो पैरामीटर के साथ इस कार्यक्रम --install/- पर Windows 7. चेक प्रशासक के रूप में स्थापना रद्द करें अस्थायी में त्रुटि लॉग। उसी पथ पर काम कर रहे लॉग की जांच करें।

0

System.Environment.UserInteractive संपत्ति आपको बताता है कि कि क्या एक Windows प्रक्रिया या आईआईएस की तरह एक सेवा है कि एक उपयोगकर्ता के बिना चलाता है इंटरफेस।

यदि यह संपत्ति गलत है, तो मोडल संवाद या संदेश बॉक्स प्रदर्शित न करें क्योंकि उपयोगकर्ता के साथ बातचीत करने के लिए कोई ग्राफिकल यूजर इंटरफेस नहीं है। Source

चेक this लेख के रूप में अच्छी तरह से।

+0

धन्यवाद, उस लेख ने वास्तव में मेरी मदद की। लेकिन लेख में, लेखक installutil का इस्तेमाल किया। मैं installutil का उपयोग नहीं करना चाहता। क्या कोई विकल्प है? उत्तर इस आलेख में है http://stackoverflow.com/questions/1449994/inno-setup-for-windows-service/1450051#1450051 लेकिन मुझे नहीं पता कि इसका उपयोग कैसे किया जाए। – Simon

+0

आप इंस्टॉलुटिल के साथ एक सेवा क्यों स्थापित नहीं करना चाहते हैं? यदि यह अनुमतियों के कारण है तो आप व्यवस्थापक अधिकारों के बिना सेवा स्थापित नहीं कर पाएंगे। इसके लिए कोई काम नहीं है। – jlafay

+0

असल में, मैं अभी भी installutil का उपयोग कर रहा हूं, लेकिन ManagedInstallerClass.InstallHelper के माध्यम से। यही तो बात है। जब मैं अपना प्रोग्राम तैनात करता हूं, तो मुझे installutil.exe को भी तैनात करने की आवश्यकता नहीं होती है। इंस्टॉलेशन डब्ल्यूएस इनो सेटअप के साथ एप्लिकेशंस इंस्टॉलेशन के दौरान किया जाता है, और यह व्यवस्थापक अधिकारों के तहत बनाया जाता है, इसलिए कोई समस्या नहीं ... – Simon

1

सबसे पहले, आपके सेवा 1 कन्स्ट्रक्टर में ServiceName प्रॉपर्टी सेट करें।

MSDN से

अंश:

न्यूनतम आप एक वर्ग ServiceBase से विरासत में मिला के लिए निर्माता में लागू करने की आवश्यकता अपने घटक पर ServiceName स्थापित करने के लिए है। कन्स्ट्रक्टर में कोई अन्य प्रसंस्करण विशेष रूप से आवश्यक नहीं है। आपको कन्स्ट्रक्टर की बजाय ऑनस्टार्ट में सबसे प्रारंभिकरण को संभालना चाहिए।

कमांड लाइन से इसे चलाने पर आपको अपनी सेवा में तर्क पारित करने की आवश्यकता है। --install स्थापना के लिए, --uninstall अनइंस्टॉल करने के लिए - अपने स्विच स्टेटमेंट को देखें, यह इनपुट तर्कों पर कर रहा है।

+0

हां, पास पैरामीटर और सही कन्स्ट्रक्टर। अभी भी कोई भाग्य नहीं है। – Simon

+0

दोह! साइमन का जवाब देखें, कि इंस्टॉलर भाग गुम है। – Mihailo

+0

बीटीडब्ल्यू, आपके पास एक विकल्प है, एक परियोजना में एक नया आइटम जोड़ते समय, विंडोज सेवा का चयन करने के लिए (प्रोजेक्ट पर राइट क्लिक करें, पॉपअप मेनू में जोड़ें -> नया आइटम ... चुनें और वहां विंडोज सेवा ढूंढें)। इसे जोड़ने के बाद आप अच्छी तरह से सेवा के गुण सेट कर सकते हैं और इंस्टॉलर्स आदि जोड़ सकते हैं – Mihailo