কোনও সার্ভারে একই উইন্ডোজ পরিষেবাটির একাধিক ইনস্ট্যান্স ইনস্টল করা


96

সুতরাং আমরা আমাদের ক্লায়েন্ট অ্যাপ্লিকেশনটিতে ডেটা ফিড করতে একটি উইন্ডোজ পরিষেবা তৈরি করেছি এবং সবকিছু দুর্দান্ত চলছে। ক্লায়েন্টটি একটি মজাদার কনফিগারেশন অনুরোধ নিয়ে হাজির হয়েছে যার জন্য একই সার্ভারে চলমান এই পরিষেবাটির দুটি উদাহরণ প্রয়োজন এবং পৃথক ডাটাবেসগুলিতে নির্দেশ করার জন্য কনফিগার করা হয়েছে।

এখনও অবধি আমি এটি ঘটতে পারিনি এবং আশা করছিলাম যে আমার সহকর্মী স্ট্যাকওভারফ্লো সদস্যরা কেন এটি সম্পর্কে কিছু ইঙ্গিত দিতে পারবেন।

বর্তমান সেটআপ:

আমি উইন্ডোজ পরিষেবা যুক্ত প্রকল্পটি সেট আপ করেছি, আমরা এখন থেকে এটি অ্যাপস সার্ভিস এবং প্রজেক্টইনস্টলার.সি ফাইল বলব যা অ্যাপকনফাইগের কোনও কীটির উপর ভিত্তি করে পরিষেবাটির নাম সেট করতে কাস্টম ইনস্টলেশন পদক্ষেপগুলি পরিচালনা করে file :

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

এই ক্ষেত্রে ইউটিল একটি স্ট্যাটিক ক্লাস যা কনফিগারেশন ফাইল থেকে পরিষেবার নামটি লোড করে।

এখান থেকে এগিয়ে আমি উভয় পরিষেবা ইনস্টল করার জন্য দুটি পৃথক উপায়ে চেষ্টা করেছি এবং উভয়ই অভিন্ন পথে ব্যর্থ হয়েছে।

প্রথম উপায়টি হ'ল কেবলমাত্র পরিষেবার প্রথম অনুলিপি ইনস্টল করা, ইনস্টল করা ডিরেক্টরিটি অনুলিপি করে পুনরায় নামকরণ করা এবং তারপরে কাঙ্ক্ষিত পরিষেবার নাম পরিবর্তন করতে অ্যাপ্লিকেশন কনফিগারেশনটি সংশোধন করে নিম্নলিখিত কমান্ডটি চালানো হয়েছিল:

InstallUtil.exe /i AppService.exe

যখন এটি কাজ না করে আমি দ্বিতীয় ইনস্টলার প্রকল্প তৈরি করার চেষ্টা করেছি, কনফিগার ফাইলটি সম্পাদনা করে দ্বিতীয় ইনস্টলারটি তৈরি করেছি। আমি ইনস্টলারটি চালানোর সময় এটি ঠিকঠাক কাজ করেছিল তবে পরিষেবাদি সেবা.এমএসসি তে প্রদর্শিত হয়নি তাই আমি দ্বিতীয় ইনস্টল কোড বেসের বিপরীতে পূর্ববর্তী কমান্ডটি চালিয়েছি।

উভয়বারই আমি ইনস্টলটুল (কেবলমাত্র প্রাসঙ্গিক অংশ) থেকে নিম্নলিখিত আউটপুট পেয়েছি:

লেনদেন করা ইনস্টলেশন চলছে।

ইনস্টলেশন ইনস্টলেশন পর্ব শুরু।

পরিষেবা ইনস্টল করা অ্যাপ্লিকেশন পরিষেবা দুই ... পরিষেবা অ্যাপ্লিকেশন পরিষেবা দুটি সফলভাবে ইনস্টল করা হয়েছে। লগ অ্যাপ্লিকেশনটিতে ইভেন্টলগ উত্স অ্যাপ্লিকেশন পরিষেবা দুটি তৈরি করা হচ্ছে ...

ইনস্টল পর্বের সময় একটি ব্যতিক্রম ঘটেছিল। System.NullReferencesException: অবজেক্ট রেফারেন্স কোনও অবজেক্টের উদাহরণে সেট করা হয়নি।

ইনস্টলেশনটির রোলব্যাক পর্ব শুরু হচ্ছে।

উত্স অ্যাপ্লিকেশন পরিষেবা দুটিয়ের জন্য পূর্ববর্তী স্থানে ইভেন্ট লগ পুনরুদ্ধার। পরিষেবা অ্যাপ সার্ভিস টু সিস্টেম থেকে সরানো হচ্ছে ... পরিষেবা অ্যাপ সার্ভিস টু সফলভাবে সিস্টেম থেকে সরানো হয়েছে।

রোলব্যাক পর্বটি সফলভাবে শেষ হয়েছে।

লেনদেন করা ইনস্টল শেষ হয়েছে। ইনস্টলেশন ব্যর্থ হয়েছে, এবং রোলব্যাকটি সম্পাদিত হয়েছে।

দীর্ঘ বাঁকা পোস্টের জন্য দুঃখিত, যথেষ্ট প্রাসঙ্গিক তথ্য আছে তা নিশ্চিত করতে চেয়েছিলেন। এখনও অবধি যে টুকরোটি আমাকে স্ট্যাম্প করেছে তা হ'ল এটি জানিয়েছে যে পরিষেবাটি ইনস্টলেশনটি সফলভাবে শেষ হয়েছে এবং ইভেন্টলগ উত্স তৈরি করতে যাওয়ার পরেই এটি নালরফারেন্সএক্সেপশন নিক্ষিপ্ত বলে মনে হচ্ছে। সুতরাং যদি কেউ জানে যে আমি কী ভুল করছি বা এর থেকে আরও ভাল পদ্ধতির থাকে তবে এটির প্রশংসা করা হবে।

উত্তর:


82

আপনি কি স্ক / পরিষেবা নিয়ামক ব্যবহারের চেষ্টা করেছেন? প্রকার

sc create

কমান্ড লাইনে এবং এটি আপনাকে সহায়তা প্রবেশাধিকার দেয় give আমি মনে করি আমি অতীতে সাবভার্সনের জন্য এটি করেছি এবং এই নিবন্ধটি একটি রেফারেন্স হিসাবে ব্যবহার করেছি :

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


4
আমি উপযোগী হতে এই পাতা পাওয়া গেছে: http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/। ইনস্টলটল চালানোর সময় আপনি যে পরিষেবাটির নাম চান সেটি পেতে আপনি ইনস্টলারে কোড সন্নিবেশ করতে পারেন।
ভিভিয়ান নদী

9
ওয়ার্ডপ্রেস ব্লগের লিঙ্কটি এতে পরিবর্তন করা হয়েছে: জার্নালফ্যাসফটওয়ার্ডেভ.ওয়ার্ডপ্রেস.com
2008

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

এই সমাধানটি আমার পক্ষে কাজ করেছিল।


4
শুধু নির্দেশ করা; [path to your exe]পুরো পথ ধরে থাকতে হবে এবং স্পেসটি ভুলে যাবেন নাbinpath=
এমকেবি

4
এটি প্রকৃতপক্ষে কোনও পরিষেবা একাধিকবার ইনস্টল করার অনুমতি দেয়। তবে পরিষেবা ইনস্টলার দ্বারা সরবরাহ করা সমস্ত তথ্য। ফে বিবরণ, লগনের ধরণ ইত্যাদি উপেক্ষা করা হবে
নোয়েল ওয়াইডার

20

আপনি নিম্নলিখিতটি করে একই পরিষেবাটির একাধিক সংস্করণ পরিচালনা করতে পারেন:

1) এক্সিকিউটযোগ্য পরিষেবাটি এবং তার নিজস্ব ফোল্ডারে কনফিগার করুন।

2) ইনস্টল অনুলিপি করুন। পরিষেবা নির্বাহযোগ্য ফোল্ডারে (। নেট ফ্রেমওয়ার্ক ফোল্ডার থেকে)

3) নিম্নলিখিত বিষয়বস্তু (অনন্য পরিষেবার নাম) সহ সার্ভিস এক্সিকিউটেবল ফোল্ডারে ইনস্টল.এক্সে.কনফিগ নামে একটি কনফিগার ফাইল তৈরি করুন:

<?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

৫) সেখানে থাকাকালীন একটি আনইনস্টল ব্যাচ ফাইল তৈরি করুন

REM Uninstall
InstallUtil.exe -u YourService.exe
pause

সম্পাদনা:

আমি কিছু মিস করেছি কিনা তা নিশ্চিত করুন, এখানে সার্ভিস ইনস্টলার ক্লাস (প্রয়োজনীয় হিসাবে সামঞ্জস্য করুন):

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());
            }
        }
    }
}

আমি মনে করি আপনি যা বর্ণনা করছেন তা কমবেশি আমি সার্ভিসনেম এবং ডিসপ্লে নামটি আমার পরিষেবাগুলি থেকে সেট করার অনুমতি দিয়ে অ্যাপ্লিকেশন করেছি .c
সুইটার 18

আমার ধরণের আমি ব্যবহার করি এমন একটি টেম্পলেট রয়েছে যা আমি যুগ যুগ ধরে ব্যবহার করেছি, তাই সম্ভবত আমি কিছু মিস করেছি, আপনার সার্ভিস ইনস্টলার ক্লাসটি দেখতে কেমন লাগে, আমি যেটি ব্যবহার করি তার একটি ওয়ার্কিং কপি পোস্ট করব, আমাকে জানতে দিন যে আমি এটি সাহায্য করি?
রেডম্যান

আমাদের পরিষেবা ইনস্টলারগুলি আসলে প্রায় অভিন্ন। আমি পরিষেবাটি লোড করতে একটি স্ট্যাটিক ক্লাস ব্যবহার করি এবং কনফিগার ফাইল থেকে নামগুলি প্রদর্শন করি তবে এগুলি ছাড়াও এগুলি খুব মিল। এটি আমার পক্ষে কেন কাজ করছে না সে সম্পর্কে আমার ধারণাটি হ'ল আমাদের পরিষেবা কোডটি সম্পর্কে কিছুটা অদ্ভুত কিছু থাকতে পারে। দুর্ভাগ্যক্রমে এর উপর অনেক হাত রয়েছে। যদিও আমি যা বুঝতে পারি তা থেকে, আপনার উত্তরটি বেশিরভাগ ক্ষেত্রে কাজ করা উচিত সাহায্যের জন্য ধন্যবাদ।
সুইটটার

4
বিশাল সাহায্য ধন্যবাদ। আমি মনে করি ইনস্টল কনফিগারেশন ফাইলটির নাম ইনস্টল করা প্রয়োজন।একটি ইনস্টল ইউটি.ইক্স.ইসি.এইসি.সিএনফিগের জন্য ইনস্টল ইউটি.এক্স.কনফিগ নয়
নুলারফারেন্স

সম্পূর্ণরূপে কার্যকর একটি দুর্দান্ত পন্থা। এটি যদি আপনি জানেন যে কোন ইনস্টলটুইল.এক্স আপনার ইনস্টলেশন ফোল্ডারে অনুলিপি করতে পারে (আমার ব্যক্তিগতভাবে অনেকগুলি ফ্রেমওয়ার্ক ভার্সন ইনস্টল করা আছে যা 64৪-বিটের অনুলিপি দ্বারা প্রসারিত)। এটি হেল্পডেস্ক টিম যদি ইনস্টলেশনগুলি করে তবে তাদের ব্যাখ্যা করা বেশ কঠিন হয়ে উঠবে। তবে বিকাশকারী-নেতৃত্বের ইনস্টলেশনের জন্য এটি খুব মার্জিত।
টিমমি

11

পুরানো প্রশ্ন, আমি জানি, তবে আমার ইনস্টলটুইল.এক্সই / সার্ভিসনেম বিকল্পটি ব্যবহার করে ভাগ্য পড়েছে। যদিও এটি বিল্ট-ইন সাহায্যে তালিকাভুক্ত দেখতে পাচ্ছি না।

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

আমি এই সম্পর্কে কোথায় প্রথম পড়েছি তা সম্পূর্ণরূপে নিশ্চিত নই তবে আমি এটি পরে দেখিনি। ওয়াইএমএমভি


4
এই ত্রুটিটি An exception occurred during the Install phase. System.ComponentModel.Win32Exception: The specified service already exists
ফিরিয়ে দেয়

@mkb আপনার কি "মাই সার্ভিস" নামে একটি পরিষেবা আছে?
জোনাথন ওয়াটনি

হ্যাঁ, প্রশ্নের মতো আমার একটি পরিষেবা রয়েছে, একই এক্সিকিউটেবল, তবে আমি এটির দুটি উদাহরণ ইনস্টল করতে চাই, প্রতিটি আলাদা আলাদা কনফিগারেশনের সাথে। আমি পরিষেবাটি কপি-পেস্ট করেছি তবে এটি কার্যকর হয়নি।
এমকিবি

4
/ servicename = "আমার পরিষেবা InstanceOne" এবং / servicename = "আমার পরিষেবা InstantTwo" নামগুলি অনন্য হতে হবে।
গ্রানাডা কোডার

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কমান্ড লাইনে নির্দিষ্ট না করেন তবে সার্ভিসটি সার্ভিসনেম এবং ডিসপ্লে-নেম মানগুলির সাথে ইনস্টল করা হবে প্রকল্প-ইনস্টলারের বৈশিষ্ট্য / কনফিগারেশনে উল্লিখিত


4
জমকালো !! আপনাকে ধন্যবাদ - এটি ঠিক যা প্রয়োজন এবং মূল বিষয়টি ছিল।
আইফ্যাকচার

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

এটি "অসাধারণ পরিষেবা - ইউএটি" নামে পরিষেবাটি তৈরি করবে। আমরা এটি একক মেশিনে পাশাপাশি চালিয়ে একই পরিষেবাটির ডিভাইন্ট, টেস্টিং এবং স্বীকৃতি সংস্করণ চালাতে ব্যবহার করেছি। প্রতিটি সংস্করণে ফাইল / কনফিগারারের নিজস্ব সেট রয়েছে - ফাইলগুলির একই সেটকে নির্দেশ করে একাধিক পরিষেবা ইনস্টল করার জন্য আমি চেষ্টা করে দেখিনি।

দ্রষ্টব্য: /ServiceSuffixপরিষেবাটি আনইনস্টল করার জন্য আপনাকে একই প্যারামিটারটি ব্যবহার করতে হবে , যাতে আপনি আনইনস্টল করার জন্য নিম্নলিখিতগুলি সম্পাদন করতে চান:

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


এটি দুর্দান্ত, তবে এটি কেবল ইনস্টলারটির জন্য। আপনার কোনও নতুন উদাহরণের নাম হয়ে গেলে, উইন্ডোজ পরিষেবাটি কীভাবে এই নতুন নামটি সম্পর্কে জানবে? আপনার কি উইন্ডোজ পরিষেবাটি নির্মাণের সময় পাস করতে হবে?
অগ্রগামী

ধন্যবাদ! উপরের সেট-নেম () পদ্ধতিতে সেট করা মানগুলি ব্যবহার করে ইনস্টলারটি উইন্ডোজ পরিষেবাটিতে নামটি সেট করবে।
ট্রায়ানস্টকফি

অবশ্যই, তবে আপনি কীভাবে বাইরের বিশ্ব থেকে এই নামটি সেট করতে পারেন?
অগ্রগামী

আমার উত্তরে বাইরের বিশ্বে পরিষেবাটি ইনস্টল করতে (এবং আনইনস্টল) করতে কমান্ড লাইনে ব্যবহৃত আদেশটি। আপনি যে মানটি পাস করেন /ServiceSuffix="UAT"সেটি ইনস্টলার দ্বারা পরিষেবাটিতে প্রত্যয় সেট করতে ব্যবহৃত হয়। আমার উদাহরণে, মানটি পাস হয়েছে UAT। আমার দৃশ্যে আমি কেবল পরিষেবার বিদ্যমান নামটিতে প্রত্যয় যুক্ত করতে চেয়েছিলাম, তবে নামটি পুরোপুরি যে মানটি দিয়ে গেছে তার সাথে পুরোপুরি প্রতিস্থাপন করতে আপনি এটি খাপ
খাইয়ে

ধন্যবাদ, তবে এটি একটি কমান্ড লাইন ইনপুট (= ম্যানুয়াল ইনপুট), কোড নয়। মূল প্রশ্ন অনুসারে: একবার আপনার নতুন উদাহরণের নাম থাকলে উইন্ডোজ পরিষেবা কীভাবে এই নতুন নামটি সম্পর্কে জানবে? আপনার কি উইন্ডোজ পরিষেবাটি নির্মাণের সময় পাস করতে হবে?
অগ্রগামী

4

এই কাজটি করার জন্য আমি যা করেছি তা হ'ল আমার পরিষেবার জন্য অ্যাপ্লিকেশন কনফিগে পরিষেবার নাম এবং প্রদর্শনের নাম সঞ্চয় করা। তারপরে আমার ইনস্টলার ক্লাসে, আমি এক্সক্লুফিগটিকে একটি এক্সএমএল ডকুমেন্ট হিসাবে লোড করি এবং মানগুলি খুঁজে পেতে এক্সপ্যাথটি ব্যবহার করি এবং সেগুলি ইনিশিয়ালকম্পোনেন্ট () কল করার আগে, সার্ভিস ইন্সটললারের সেবা নাম এবং সার্ভিস ইন্টাস্ট্রাল.ডিসপ্লে-নেমে প্রয়োগ করি। এটি ধরে নিয়েছে যে আপনি ইনিশিয়াল কম্পোনেন্ট () তে ইতিমধ্যে এই বৈশিষ্ট্যগুলি সেট করছেন না, সেক্ষেত্রে আপনার কনফিগার ফাইল থেকে সেটিংস উপেক্ষা করা হবে। নিম্নলিখিত কোডটি আমি আমার ইনস্টলার ক্লাস কনস্ট্রাক্টরের কাছ থেকে কল করছি, ইনিশিয়ালকম্পোনেন্ট () এর আগে:

       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;
          }
      }

আমি বিশ্বাস করি না যে কনফিগারেশন ফাইলটি সরাসরি কনফিগারেশন ম্যানেজার.অ্যাপসেটেটিংগুলি থেকে পড়তে হবে বা ইনস্টলারটি রান করার সময় এর মতো কিছু কাজ করবে, এটি আপনার সার্ভিসের .exe নয়, ইনস্টলটিল.এক্সি প্রসঙ্গে চালিত হবে। আপনি কনফিগারেশন ম্যানেজ.ওপেনএক্সে কনফিগারেশন দিয়ে কিছু করতে সক্ষম হতে পারেন, তবে আমার ক্ষেত্রে, এটি লোড হয়নি এমন একটি কাস্টম কনফিগারেশন বিভাগে যাওয়ার চেষ্টা করায় এটি কার্যকর হয়নি।


হাই ক্রিস হাউস! আপনার উত্তরে হোঁচট খেয়েছে কারণ আমি কোয়ার্টজ.এনইটি শিডিয়ুলারের চারপাশে একটি স্ব-হোস্টেড ওউইন-ভিত্তিক ওয়েব এপিআই তৈরি করছি এবং এটি একটি উইন্ডোজ পরিষেবাতে স্টিক করছি। খুব স্মার্ট! আশা করছি আপনি ভাল আছেন!
নোভাজো

হাই ক্রিস হাউস! আপনার উত্তরে হোঁচট খেয়েছে কারণ আমি কোয়ার্টজ.এনইটি শিডিয়ুলারের চারপাশে একটি স্ব-হোস্টেড ওউইন-ভিত্তিক ওয়েব এপিআই তৈরি করছি এবং এটি একটি উইন্ডোজ পরিষেবাতে স্টিক করছি। খুব স্মার্ট! আশা করছি আপনি ভাল আছেন!
নোভাজো

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 বা .msi এ সফলভাবে ইনস্টল করা হয়েছে rebu


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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.