एक सर्वर पर एक ही विंडोज़ सेवा के कई उदाहरण स्थापित करना


96

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

अब तक मैं ऐसा करने में सक्षम नहीं हो पाया था और उम्मीद कर रहा था कि मेरे साथी स्टैकओवरफ्लो सदस्य कुछ संकेत देने में सक्षम हो सकते हैं क्यों।

मौजूदा सेटअप:

मैंने वह परियोजना स्थापित की है जिसमें विंडोज़ सेवा शामिल है, हम इसे अभी से AppService कहेंगे, और ProjectInstaller.cs फ़ाइल जो App.config में एक कुंजी के आधार पर सेवा का नाम सेट करने के लिए कस्टम इंस्टॉलेशन चरणों को संभालती है। :

this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;

इस मामले में Util सिर्फ एक स्थिर वर्ग था जो विन्यास फाइल से सेवा का नाम लेता है।

यहां से आगे मैंने दोनों सेवाओं को स्थापित करने के लिए दो अलग-अलग तरीकों की कोशिश की है और दोनों एक समान तरीके से विफल रहे हैं।

पहला तरीका केवल सेवा की पहली प्रति स्थापित करना था, स्थापित निर्देशिका की प्रतिलिपि बनाना और उसका नाम बदला, और फिर वांछित सेवा का नाम बदलने के लिए एप्लिकेशन कॉन्फिगर को संशोधित करने के बाद निम्नलिखित कमांड को चलाया:

InstallUtil.exe /i AppService.exe

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

दोनों बार मुझे इंस्टाल यूटिल (केवल प्रासंगिक हिस्से) से निम्न आउटपुट प्राप्त हुए:

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

स्थापना के चरण को शुरू करना।

सेवा ऐप सेवा दो को स्थापित कर रहा है ... सेवा ऐप सेवा दो को सफलतापूर्वक स्थापित किया गया है। EventLog स्रोत ऐप सेवा दो लॉग एप्लीकेशन में बना रहा है ...

इंस्टॉल चरण के दौरान एक अपवाद हुआ। System.NullReferenceException: ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट की आवृत्ति पर सेट नहीं है।

स्थापना का रोलबैक चरण शुरू हो रहा है।

स्रोत ऐप सेवा दो के लिए पिछली स्थिति में रिस्टोरिंग इवेंट लॉग। सेवा ऐप सेवा दो को सिस्टम से हटाया जा रहा है ... सेवा ऐप सेवा दो को सफलतापूर्वक सिस्टम से हटा दिया गया था।

रोलबैक चरण सफलतापूर्वक पूरा हुआ।

लेन-देन स्थापित पूरा हो गया है। स्थापना विफल रही, और रोलबैक प्रदर्शन किया गया है।

लंबी घुमावदार पोस्ट के लिए क्षमा करें, यह सुनिश्चित करना चाहते हैं कि पर्याप्त प्रासंगिक जानकारी हो। अब तक मुझे जो टुकड़ा मिला है, वह यह है कि यह बताता है कि सेवा की स्थापना सफलतापूर्वक पूर्ण हो गई है और इसके बाद ही यह EventLog स्रोत बनाने के लिए जाता है कि NullReferenceException को फेंक दिया गया लगता है। तो अगर किसी को पता है कि मैं क्या गलत कर रहा हूं या एक बेहतर दृष्टिकोण है तो यह बहुत सराहना की जाएगी।

जवाबों:


81

क्या आपने sc / सेवा नियंत्रक उपयोग की कोशिश की है? प्रकार

sc create

एक कमांड लाइन पर, और यह आपको हेल्प एंट्री देगा। मुझे लगता है कि मैंने इसे तोड़फोड़ के लिए अतीत में किया है और इस लेख को संदर्भ के रूप में इस्तेमाल किया है :

http://svn.apache.org/repos/asf/subversion/trunk/notes/windows-service.txt


5
मुझे यह पृष्ठ उपयोगी लगा http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/। इंस्टॉलर का सेवा नाम पाने के लिए आप इंस्टॉलर में कोड डाल सकते हैं।
विवियन नदी

9
WordPress ब्लॉग का लिंक बदल दिया गया है: journalofasoftwaredev.wordpress.com/2008/07
STLDev

21
  sc create [servicename] binpath= [path to your exe]

इस समाधान ने मेरे लिए काम किया।


5
सिर्फ इशारा करने के लिए; [path to your exe]पूर्ण पथ होना करने के लिए किया है और भूल नहीं है अंतरिक्ष के बादbinpath=
MKB

2
यह वास्तव में एक सेवा को कई बार स्थापित करने की अनुमति देता है। हालाँकि, सर्विस इंस्टॉलर द्वारा दी गई सभी जानकारी। Fe विवरण, लॉगऑन प्रकार आदि को नजरअंदाज किया जाता है
नोएल विडमर

20

आप निम्न कार्य करके एक ही सेवा के कई संस्करण चला सकते हैं:

1) सेवा निष्पादन योग्य कॉपी करें और अपने स्वयं के फ़ोल्डर में कॉन्फ़िगर करें।

2) स्थापित करें। सेवा निष्पादन योग्य फ़ोल्डर में स्थापित करें (.net फ्रेमवर्क फ़ोल्डर से)

3) निम्नलिखित सामग्री (अद्वितीय सेवा नामों) के साथ सेवा निष्पादन योग्य फ़ोल्डर में Install.exe.config नामक एक विन्यास फ़ाइल बनाएँ:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="ServiceName" value="The Service Name"/>
    <add key="DisplayName" value="The Service Display Name"/>
  </appSettings>
</configuration>

4) निम्नलिखित सामग्री के साथ सेवा स्थापित करने के लिए एक बैच फ़ाइल बनाएँ:

REM Install
InstallUtil.exe YourService.exe
pause

5) अपने वहाँ रहते हुए, एक अनइंस्टॉल बैच फ़ाइल बनाएँ

REM Uninstall
InstallUtil.exe -u YourService.exe
pause

संपादित करें:

ध्यान दें कि अगर मैं कुछ चूक गया, तो यहां ServiceInstaller Class (आवश्यकतानुसार समायोजित करें) है:

using System.Configuration;

namespace Made4Print
{
    partial class ServiceInstaller
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        private System.ServiceProcess.ServiceInstaller FileProcessingServiceInstaller;
        private System.ServiceProcess.ServiceProcessInstaller FileProcessingServiceProcessInstaller;

        /// <summary> 
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.FileProcessingServiceInstaller = new System.ServiceProcess.ServiceInstaller();
            this.FileProcessingServiceProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller();
            // 
            // FileProcessingServiceInstaller
            // 
            this.FileProcessingServiceInstaller.ServiceName = ServiceName;
            this.FileProcessingServiceInstaller.DisplayName = DisplayName;
            // 
            // FileProcessingServiceProcessInstaller
            // 
            this.FileProcessingServiceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
            this.FileProcessingServiceProcessInstaller.Password = null;
            this.FileProcessingServiceProcessInstaller.Username = null;
            // 
            // ServiceInstaller
            // 
            this.Installers.AddRange(new System.Configuration.Install.Installer[] { this.FileProcessingServiceInstaller, this.FileProcessingServiceProcessInstaller });
        }

        #endregion

        private string ServiceName
        {
            get
            {
                return (ConfigurationManager.AppSettings["ServiceName"] == null ? "Made4PrintFileProcessingService" : ConfigurationManager.AppSettings["ServiceName"].ToString());
            }
        }

        private string DisplayName
        {
            get
            {
                return (ConfigurationManager.AppSettings["DisplayName"] == null ? "Made4Print File Processing Service" : ConfigurationManager.AppSettings["DisplayName"].ToString());
            }
        }
    }
}

मुझे लगता है कि आप जो वर्णन कर रहे हैं, वह कम या ज्यादा है जो मैंने सेवा नाम और DisplayName को अपनी सेवाओं से सेट करने की अनुमति देकर किया है।
तैराक

मेरे पास एक तरह का टेम्पलेट है जिसका मैं उपयोग करता हूं, जो मैंने उम्र के लिए उपयोग किया है, इसलिए शायद मैं कुछ चूक गया, आपका ServiceInstaller वर्ग कैसा दिखता है, मैं जिस एक का उपयोग करता हूं, उसकी एक कार्यशील प्रति पोस्ट करूंगा, मुझे पता है कि मुझे fthis मदद करता है?
मार्क रेडमैन

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

2
बहुत मदद धन्यवाद। मुझे लगता है कि इनस्टॉल config फाइल को InstallUtil.exe.confg नाम से इंस्टॉल करने की आवश्यकता है। InstallU.til.exe के लिए Install.exe.config नहीं
NullReference

एक अच्छा तरीका जो पूरी तरह से काम करता है। अगर आपको पता है कि आपके इंस्टालेशन फोल्डर में कॉपी करने के लिए कौन सा InstallUtil.exe है (मेरे पास व्यक्तिगत रूप से बहुत सारे फ्रेमवर्क संस्करण स्थापित हैं जो कि 64-बिट प्रतियों द्वारा तैयार किए गए हैं)। अगर वे इंस्टॉलेशन करते हैं तो हेल्पडेस्क टीम को समझाना काफी मुश्किल होगा। लेकिन डेवलपर-लीड इंस्टॉलेशन के लिए यह बहुत सुरुचिपूर्ण है।
टिम्मि 4sa

11

पुराना प्रश्न, मुझे पता है, लेकिन मुझे InstallUtil.exe पर / servicename विकल्प का उपयोग करने का सौभाग्य मिला है। मैं इसे अंतर्निहित मदद में सूचीबद्ध नहीं देखता, हालांकि।

InstallUtil.exe /servicename="My Service" MyService.exe

मुझे पूरी तरह से यकीन नहीं है कि मैंने पहली बार इस बारे में कहां पढ़ा है लेकिन मैंने इसे नहीं देखा है। YMMV।


3
यह त्रुटि देता है:An exception occurred during the Install phase. System.ComponentModel.Win32Exception: The specified service already exists
mkb

@ mkb क्या आपके पास "मेरी सेवा" नामक एक अन्य सेवा है?
जोनाथन वाटनी

हां, जैसा कि प्रश्न में मेरी एक सेवा है, एक ही निष्पादन योग्य है, लेकिन मैं इसके दो उदाहरण स्थापित करना चाहता हूं, प्रत्येक अलग-अलग कॉन्फ़िगरेशन के साथ। मैं सेवा exe की प्रतिलिपि बनाता हूं, लेकिन यह काम नहीं करता है।
mkb

1
/ servicename = "My Service InstanceOne" और / servicename = "My Service InstanceTwo" नाम अद्वितीय होने चाहिए।
ग्रेनडाकोडर

11

कस्टम लाइन निर्दिष्ट करने के लिए ServiceNameऔर कमांड लाइन मापदंडों DisplayNameका उपयोग करने का एक और त्वरित तरीका है installutil

  1. आपकी ProjectInstallerकक्षा में आभासी विधियों को ओवरराइड करें Install(IDictionary stateSaver)औरUninstall(IDictionary savedState)

    public override void Install(System.Collections.IDictionary stateSaver)
    {
        GetCustomServiceName();
        base.Install(stateSaver);
    }
    
    public override void Uninstall(System.Collections.IDictionary savedState)
    {
        GetCustomServiceName();
        base.Uninstall(savedState);
    }
    
    //Retrieve custom service name from installutil command line parameters
    private void GetCustomServiceName()
    {
        string customServiceName = Context.Parameters["servicename"];
        if (!string.IsNullOrEmpty(customServiceName))
        {
            serviceInstaller1.ServiceName = customServiceName;
            serviceInstaller1.DisplayName = customServiceName;
        }
    }
  2. अपना प्रोजेक्ट बनाएं
  3. पैरामीटर installutilका उपयोग करके अपने कस्टम नाम को जोड़ने के साथ सेवा स्थापित करें /servicename:

    installutil.exe /servicename="CustomServiceName" "c:\pathToService\SrvcExecutable.exe"
    

कृपया ध्यान दें कि यदि आप /servicenameकमांड लाइन में निर्दिष्ट नहीं करते हैं, तो सेवा ProjectName और DisplayName मान के साथ स्थापित की जाएगी।


2
प्रतिभाशाली!! धन्यवाद - यह वही था जो जरूरत थी और बिंदु तक।
इओफैक्ट्योर

7

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

public partial class ProjectInstaller : System.Configuration.Install.Installer
{
  protected override void OnBeforeInstall(IDictionary savedState)
  {
    base.OnBeforeInstall(savedState);
    SetNames();
  }

  protected override void OnBeforeUninstall(IDictionary savedState)
  {
    base.OnBeforeUninstall(savedState);
    SetNames();
  }

  private void SetNames()
  {
    this.serviceInstaller1.DisplayName = AddSuffix(this.serviceInstaller1.DisplayName);
    this.serviceInstaller1.ServiceName = AddSuffix(this.serviceInstaller1.ServiceName);
  }

  private string AddSuffix(string originalName)
  {
    if (!String.IsNullOrWhiteSpace(this.Context.Parameters["ServiceSuffix"]))
      return originalName + " - " + this.Context.Parameters["ServiceSuffix"];
    else
      return originalName;
  }
}

इसे ध्यान में रखते हुए, मैं निम्नलिखित कार्य कर सकता हूं: यदि मैंने सेवा को "भयानक सेवा" कहा है, तो मैं इस प्रकार सेवा का यूएटी सत्यापन स्थापित कर सकता हूं:

InstallUtil.exe /ServiceSuffix="UAT" MyService.exe

यह "विस्मयकारी सेवा - यूएटी" नाम से सेवा का निर्माण करेगा। हमने एक ही मशीन पर अगल-बगल चलने वाली एक ही सेवा के DEVINT, TESTING और ACCEPTANCE संस्करण चलाने के लिए इसका उपयोग किया है। प्रत्येक संस्करण में फ़ाइलों का अपना सेट / कॉन्फिग होता है - मैंने फ़ाइलों के एक ही सेट पर इंगित कई सेवाओं को स्थापित करने के लिए यह कोशिश नहीं की है।

नोट: आपको /ServiceSuffixसेवा की स्थापना रद्द करने के लिए एक ही पैरामीटर का उपयोग करना होगा, इसलिए आप स्थापना रद्द करने के लिए निम्नलिखित पर अमल करेंगे:

InstallUtil.exe /u /ServiceSuffix="UAT" MyService.exe


यह बहुत अच्छा है, लेकिन यह सिर्फ इंस्टॉलर के लिए है। एक बार आपके पास एक नया उदाहरण नाम होने के बाद, Windows सेवा को इस नए नाम के बारे में कैसे पता चलेगा? क्या आपको विंडोज सेवा के निर्माण पर इसे पास करना होगा?
प्रोगेलर

धन्यवाद! इंस्टॉलर विंडोज सर्विस पर नाम सेट करेगा जबकि इसे सेटनाम () विधि में सेट किए गए मानों का उपयोग करके इंस्टॉल कर रहा है।
ट्रिस्टेंकॉफ़ी

ज़रूर, लेकिन आप इस नाम को बाहरी दुनिया से कैसे सेट कर सकते हैं?
प्रोग्लेरर

मेरे उत्तर में कमांड लाइन पर कमांड का उपयोग बाहरी दुनिया में सेवा को स्थापित (और अनइंस्टॉल) करने के लिए किया जाता है। आपके /ServiceSuffix="UAT"द्वारा पास किया जाने वाला मान सेवा द्वारा प्रत्यय सेट करने के लिए इंस्टॉलर द्वारा उपयोग किया जाता है। मेरे उदाहरण में, मान दिया गया है UAT। मेरी परिदृश्य में मैं बस सेवा के मौजूदा नाम पर एक प्रत्यय जोड़ना चाहते थे, लेकिन ऐसा कोई कारण नहीं आप इस अनुकूलन नहीं कर सकता है मूल्य है कि में पारित कर दिया है के साथ पूरी तरह से नाम बदलने के लिए है।
tristankoffee

धन्यवाद, लेकिन यह एक कमांड लाइन इनपुट (= मैनुअल इनपुट) है, कोड नहीं। मूल प्रश्न के अनुसार: एक बार आपके पास एक नया उदाहरण नाम है, तो Windows सेवा को इस नए नाम के बारे में कैसे पता चलेगा? क्या आपको विंडोज सेवा के निर्माण पर इसे पास करना होगा?
प्रोग्लेरर

4

मैंने यह काम करने के लिए जो किया है वह सेवा नाम और प्रदर्शन नाम को मेरी सेवा के लिए app.config में संग्रहीत करने के लिए है। फिर अपने इंस्टॉलर वर्ग में, मैं एक ऐप्लीकेशन के रूप में app.config को लोड करता हूं और मानों को बाहर निकालने के लिए Xpath का उपयोग करता हूं और InitializeComponent () पर कॉल करने से पहले ServiceInstaller.ServiceName और ServiceInstaller.DisplayName पर उन्हें लागू करता हूं। यह मान लेता है कि आप इन संपत्तियों को पहले से ही InitializeComponent () में सेट नहीं कर रहे हैं, इस स्थिति में, आपकी कॉन्फ़िग फ़ाइल की सेटिंग्स को अनदेखा कर दिया जाएगा। निम्न कोड वह है जो मैं अपने इंस्टॉलर वर्ग निर्माता से कह रहा हूं, InitializeComponent () से पहले:

       private void SetServiceName()
       {
          string configurationFilePath = Path.ChangeExtension(Assembly.GetExecutingAssembly().Location, "exe.config");
          XmlDocument doc = new XmlDocument();
          doc.Load(configurationFilePath);

          XmlNode serviceName = doc.SelectSingleNode("/xpath/to/your/@serviceName");
          XmlNode displayName = doc.SelectSingleNode("/xpath/to/your/@displayName");

          if (serviceName != null && !string.IsNullOrEmpty(serviceName.Value))
          {
              this.serviceInstaller.ServiceName = serviceName.Value;
          }

          if (displayName != null && !string.IsNullOrEmpty(displayName.Value))
          {
              this.serviceInstaller.DisplayName = displayName.Value;
          }
      }

मुझे विश्वास नहीं है कि कॉन्फ़िगरेशन फ़ाइल को सीधे configurationManager.AppSettings से पढ़ना या ऐसा ही कुछ काम करेगा जब इंस्टॉलर चलता है, यह InstallUtil.exe के संदर्भ में चलाया जाता है, आपकी सेवा के .exe के रूप में नहीं। आप configurationManager.OpenExeConfiguration के साथ कुछ करने में सक्षम हो सकते हैं, हालांकि मेरे मामले में, यह काम नहीं किया क्योंकि मैं एक कस्टम कॉन्फ़िगरेशन अनुभाग को प्राप्त करने की कोशिश कर रहा था जो लोड नहीं हुआ था।


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

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

4

बस @ chris.house.00 का सही जवाब सुधार करने के लिए इस है, तो आप समारोह निम्नलिखित अपनी ऐप सेटिंग से पढ़ने के लिए विचार कर सकते हैं:

 public void GetServiceAndDisplayName(out string serviceNameVar, out string displayNameVar)
        {
            string configurationFilePath = Path.ChangeExtension(Assembly.GetExecutingAssembly().Location, "exe.config");
            XmlDocument doc = new XmlDocument();
            doc.Load(configurationFilePath);

            XmlNode serviceName = doc.SelectSingleNode("//appSettings//add[@key='ServiceName']");
            XmlNode displayName = doc.SelectSingleNode("//appSettings//add[@key='DisplayName']");


            if (serviceName != null && (serviceName.Attributes != null && (serviceName.Attributes["value"] != null)))
            {
                serviceNameVar = serviceName.Attributes["value"].Value;
            }
            else
            {
                serviceNameVar = "Custom.Service.Name";
            }

            if (displayName != null && (displayName.Attributes != null && (displayName.Attributes["value"] != null)))
            {
                displayNameVar = displayName.Attributes["value"].Value;
            }
            else
            {
                displayNameVar = "Custom.Service.DisplayName";
            }
        }

2

मेरे पास एक ऐसी ही स्थिति थी, जहाँ मुझे जरूरत थी एक पिछली सेवा की, और एक अद्यतन सेवा एक ही सर्वर पर एक साथ चल रही थी। (यह सिर्फ एक डेटाबेस परिवर्तन से अधिक था, यह कोड परिवर्तन भी था)। इसलिए मैं सिर्फ एक ही .exe दो बार नहीं चला सकता। मुझे एक नया .exe चाहिए था जो नए DLL के साथ संकलित किया गया था लेकिन उसी परियोजना से। बस सेवा का नाम बदलने और सेवा का प्रदर्शन नाम मेरे लिए काम नहीं करता था, फिर भी मुझे "सेवा पहले से मौजूद त्रुटि" प्राप्त हुई, जो मुझे विश्वास है क्योंकि मैं एक तैनाती परियोजना का उपयोग कर रहा हूं। आखिरकार मेरे लिए क्या काम किया मेरी तैनाती परियोजना गुण के भीतर "ProductCode" नामक एक संपत्ति है जो एक गाइड है।

यहां छवि विवरण दर्ज करें

उसके बाद, सेटअप प्रोजेक्ट को एक नए .exe या .msi में सफलतापूर्वक स्थापित करना।


1

सरलतम दृष्टिकोण dll नाम पर सेवा नाम आधारित है:

string sAssPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string sAssName = System.IO.Path.GetFileNameWithoutExtension(sAssPath);
if ((this.ServiceInstaller1.ServiceName != sAssName)) {
    this.ServiceInstaller1.ServiceName = sAssName;
    this.ServiceInstaller1.DisplayName = sAssName;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.