.NET উইন্ডোজ পরিষেবাটি কীভাবে ইনস্টল করার ঠিক পরে শুরু করবেন?


88

পরিষেবাটি ছাড়াও art স্টার্টটাইপ = সার্ভিস স্টার্টমোড.আউটমেটিক আমার পরিষেবা ইনস্টলেশন পরে আরম্ভ হয় না

সমাধান

এই প্রকল্পটি আমার প্রজেক্টইনস্টলারের ভিতরে .োকানো হয়েছে

protected override void OnAfterInstall(System.Collections.IDictionary savedState)
{
    base.OnAfterInstall(savedState);
    using (var serviceController = new ServiceController(this.serviceInstaller1.ServiceName, Environment.MachineName))
        serviceController.Start();
}

স্কটএক্স এবং ফ্রান্সিস বি কে ধন্যবাদ


এটি ইনস্টলেশন পরে ঠিক শুরু হয় না বা আপনি পুনরায় বুট করার সময় এটি শুরু হয় না?
ক্রিস ভ্যান অপস্টাল

উত্তর:


21

ইনস্টলটল প্রক্রিয়া থেকে বরখাস্ত হওয়া ইভেন্টগুলির প্রতিক্রিয়া হিসাবে আপনি আপনার পরিষেবার মধ্যে থেকে এক্সিকিউটেবলের মধ্যে থেকে এটি সব করতে পারেন। পরিষেবাটি চালু করতে কোনও সার্ভিস কনট্রোলার ক্লাস ব্যবহার করতে অনএফটারইনস্টল ইভেন্টটি ওভাররাইড করুন।

http://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceinstaller.aspx


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

181

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

আমার মনে নেই আমি এটি মূলত কোথায় পেয়েছি (সম্ভবত মার্ক গ্র্যাভেল?) তবে আমি অনলাইনে এমন একটি সমাধান খুঁজে পেয়েছি যা আপনাকে সত্যিকার অর্থে নিজের পরিষেবা চালিয়ে আপনার পরিষেবাটি ইনস্টল করতে এবং শুরু করতে দেয়। এখানে ধাপে ধাপে:

  1. গঠন Main()ভালো আপনার পরিষেবার ফাংশন:

    static void Main(string[] args)
    {
        if (args.Length == 0) {
            // Run your service normally.
            ServiceBase[] ServicesToRun = new ServiceBase[] {new YourService()};
            ServiceBase.Run(ServicesToRun);
        } else if (args.Length == 1) {
            switch (args[0]) {
                case "-install":
                    InstallService();
                    StartService();
                    break;
                case "-uninstall":
                    StopService();
                    UninstallService();
                    break;
                default:
                    throw new NotImplementedException();
            }
        }
    }
    
  2. এখানে সমর্থনকারী কোড:

    using System.Collections;
    using System.Configuration.Install;
    using System.ServiceProcess;
    
    private static bool IsInstalled()
    {
        using (ServiceController controller = 
            new ServiceController("YourServiceName")) {
            try {
                ServiceControllerStatus status = controller.Status;
            } catch {
                return false;
            }
            return true;
        }
    }
    
    private static bool IsRunning()
    {
        using (ServiceController controller = 
            new ServiceController("YourServiceName")) {
            if (!IsInstalled()) return false;
            return (controller.Status == ServiceControllerStatus.Running);
        }
    }
    
    private static AssemblyInstaller GetInstaller()
    {
        AssemblyInstaller installer = new AssemblyInstaller(
            typeof(YourServiceType).Assembly, null);
        installer.UseNewContext = true;
        return installer;
    }
    
  3. সমর্থনকারী কোড দিয়ে চালিয়ে যাচ্ছি ...

    private static void InstallService()
    {
        if (IsInstalled()) return;
    
        try {
            using (AssemblyInstaller installer = GetInstaller()) {
                IDictionary state = new Hashtable();
                try {
                    installer.Install(state);
                    installer.Commit(state);
                } catch {
                    try {
                        installer.Rollback(state);
                    } catch { }
                    throw;
                }
            }
        } catch {
            throw;
        }
    }
    
    private static void UninstallService()
    {
        if ( !IsInstalled() ) return;
        try {
            using ( AssemblyInstaller installer = GetInstaller() ) {
                IDictionary state = new Hashtable();
                try {
                    installer.Uninstall( state );
                } catch {
                    throw;
                }
            }
        } catch {
            throw;
        }
    }
    
    private static void StartService()
    {
        if ( !IsInstalled() ) return;
    
        using (ServiceController controller = 
            new ServiceController("YourServiceName")) {
            try {
                if ( controller.Status != ServiceControllerStatus.Running ) {
                    controller.Start();
                    controller.WaitForStatus( ServiceControllerStatus.Running, 
                        TimeSpan.FromSeconds( 10 ) );
                }
            } catch {
                throw;
            }
        }
    }
    
    private static void StopService()
    {
        if ( !IsInstalled() ) return;
        using ( ServiceController controller = 
            new ServiceController("YourServiceName")) {
            try {
                if ( controller.Status != ServiceControllerStatus.Stopped ) {
                    controller.Stop();
                    controller.WaitForStatus( ServiceControllerStatus.Stopped, 
                         TimeSpan.FromSeconds( 10 ) );
                }
            } catch {
                throw;
            }
        }
    }
    
  4. এই মুহুর্তে, আপনি টার্গেট মেশিনে আপনার পরিষেবা ইনস্টল করার পরে, আপনার পরিষেবাটি -installইনস্টল করতে এবং শুরু করার জন্য কমান্ড লাইন আর্গুমেন্টের সাথে কমান্ড লাইন (কোনও সাধারণ অ্যাপ্লিকেশনের মতো) থেকে আপনার পরিষেবাটি চালান ।

আমি মনে করি আমি সবকিছু আবৃত করেছি, তবে আপনি যদি এটি কাজ করেন না তবে দয়া করে আমাকে জানান যাতে আমি উত্তর আপডেট করতে পারি।


13
নোট করুন যে এই সমাধানটির জন্য ইনস্টলটুইল.এক্সি ব্যবহারের প্রয়োজন নেই, সুতরাং আপনার ইনস্টলেশন প্রোগ্রামের অংশ হিসাবে আপনাকে এটি সরবরাহ করতে হবে না।
ম্যাট ডেভিস

4
খালি "ক্যাচ-থ্রো;}" ধারাগুলি কী? এছাড়াও, "রোলব্যাক ()" দ্বারা ব্যর্থতাগুলি আড়াল করা সম্ভবত ভাল ধারণা নয় কারণ পরিস্থিতিটি মূলত সিস্টেমটিকে একটি অনির্ধারিত অবস্থায় ফেলে দেয় বলে আমার ধারণা (আপনি কোনও পরিষেবা ইনস্টল করার চেষ্টা করেছেন, মাঝখানে কোথাও ব্যর্থ হয়েছেন এবং এটিকে পূর্বাবস্থায় ফেরাতে পারবেন না) )। আপনার ব্যবহারকারীকে কমপক্ষে "দেখিয়ে" দেখাতে হবে যে মশলাদার কিছু রয়েছে - বা রোলব্যাক () ফাংশনটি কনসোলে কিছু বার্তা লিখবে?
খ্রিস্টান.কে

4
রোলব্যাক কনসোলে ডেটা লিখবে। খালি ধরার ব্লক হিসাবে, এটি একটি ডিবাগিং জিনিস। যে কোনও ব্যতিক্রম ঘটতে পারে তা পরীক্ষা করতে আমি থ্রো স্টেটমেন্টে একটি ব্রেকপয়েন্ট রাখতে পারি।
ম্যাট ডেভিস

4
আমি ভুল ত্রুটি পাচ্ছি: টাইপ বা নামস্থান নাম 'YourServiceType' খুঁজে পাওয়া যাবে না (যদি আপনি ব্যবহার নির্দেশ অথবা কোনো সমাবেশ রেফারেন্স অনুপস্থিত?
যোগেশ

4
YourServiceTypeহয় ProjectInstallerআপনি পরিষেবা যা ধারণ করে যোগ করা ServiceInstallerএবংServiceProcessInstaller
Bansi

6

ভিসুয়াল স্টুডিও

আপনি যদি ভিএস দিয়ে কোনও সেটআপ প্রকল্প তৈরি করে থাকেন তবে আপনি একটি কাস্টম অ্যাকশন তৈরি করতে পারেন যাকে পরিষেবা শুরু করার জন্য .NET পদ্ধতি বলে। তবে, কোনও এমএসআই-তে পরিচালিত কাস্টম অ্যাকশন ব্যবহার করার জন্য এটি প্রস্তাবিত নয়। এই পৃষ্ঠাটি দেখুন ।

ServiceController controller  = new ServiceController();
controller.MachineName = "";//The machine where the service is installed;
controller.ServiceName = "";//The name of your service installed in Windows Services;
controller.Start();

ইনস্টলশিল্ড বা বুদ্ধিমান

আপনি যদি ইনস্টলশিল্ড বা বুদ্ধিমান ব্যবহার করে থাকেন তবে এই অ্যাপ্লিকেশনগুলি পরিষেবাটি শুরু করার বিকল্প সরবরাহ করে। বুদ্ধিমানের সাথে উদাহরণস্বরূপ, আপনাকে একটি পরিষেবা নিয়ন্ত্রণ ক্রিয়া যুক্ত করতে হবে। এই ক্রিয়ায় আপনি পরিষেবাটি শুরু করতে বা বন্ধ করতে চান কিনা তা নির্দিষ্ট করে দিন।

উইক্স

উইক্স ব্যবহার করে আপনাকে আপনার পরিষেবার অংশের নীচে নিম্নলিখিত এক্সএমএল কোড যুক্ত করতে হবে। সে সম্পর্কে আরও তথ্যের জন্য, আপনি এই পৃষ্ঠাটি চেক করতে পারেন ।

<ServiceInstall 
    Id="ServiceInstaller"  
    Type="ownProcess"  
    Vital="yes"  
    Name=""  
    DisplayName=""  
    Description=""  
    Start="auto"  
    Account="LocalSystem"   
    ErrorControl="ignore"   
    Interactive="no">  
        <ServiceDependency Id="????"/> ///Add any dependancy to your service  
</ServiceInstall>

5

উত্স হিসাবে EXE এর উপাদানটির নাম বা একটি ব্যাচ (এসসি স্টার্ট) ব্যবহার করে আপনাকে এমএসআইতে 'এক্সিকিউটআইমিডিয়েট' ক্রমের শেষে একটি কাস্টম অ্যাকশন যুক্ত করতে হবে। আমি ভিজুয়াল স্টুডিওর মাধ্যমে এটি করা যেতে পারে বলে মনে করি না, এজন্য আপনাকে একটি বাস্তব এমএসআই অনুমোদনের সরঞ্জাম ব্যবহার করতে হতে পারে।


4

ইনস্টলেশন শেষে ঠিক এটি শুরু করার জন্য, আমি ইনস্টল্টিল সহ একটি ব্যাচ ফাইল তৈরি করি যারপরে স্কার্ট শুরু হয়

এটি আদর্শ নয়, তবে এটি কাজ করে ....


4

এটি শুরু করতে .NET সার্ভিস কনট্রোলার ক্লাসটি ব্যবহার করুন, বা এটি শুরু করতে কমান্ডলাইন কমান্ড জারি করুন --- "নেট স্টার্ট সার্ভিসনেম"। যেভাবেই কাজ করে।


4

স্কটটেক্সের উত্তর যুক্ত করতে, আপনি যদি মাইক্রোসফ্ট পদ্ধতিতে এটি করেন তবে পরিষেবাটি শুরু করার জন্য আসল কোডটি এখানে (যেমন একটি সেটআপ প্রকল্প ব্যবহার করে ইত্যাদি) চালু করে )

(VB.net কোডটি ক্ষমা করুন, তবে এটিই আমি আটকে রয়েছি)

Private Sub ServiceInstaller1_AfterInstall(ByVal sender As System.Object, ByVal e As System.Configuration.Install.InstallEventArgs) Handles ServiceInstaller1.AfterInstall
    Dim sc As New ServiceController()
    sc.ServiceName = ServiceInstaller1.ServiceName

    If sc.Status = ServiceControllerStatus.Stopped Then
        Try
            ' Start the service, and wait until its status is "Running".
            sc.Start()
            sc.WaitForStatus(ServiceControllerStatus.Running)

            ' TODO: log status of service here: sc.Status
        Catch ex As Exception
            ' TODO: log an error here: "Could not start service: ex.Message"
            Throw
        End Try
    End If
End Sub

উপরের ইভেন্ট হ্যান্ডলারটি তৈরি করতে, 2 প্রকল্পগুলি যেখানে প্রজেক্ট ইনস্টলারের ডিজাইনারে যান সেখানে যান। সার্ভিস ইনস্টলার 1 নিয়ন্ত্রণে ক্লিক করুন। ইভেন্টগুলির অধীনে বৈশিষ্ট্য উইন্ডোতে যান এবং সেখানে আপনি আফটার ইনস্টল ইভেন্টটি পাবেন।

দ্রষ্টব্য: উপরের কোডটি সার্ভিসপ্রসেসইনস্টলার 1 এর জন্য আফটার ইনস্টল ইভেন্টের মধ্যে রাখবেন না। অভিজ্ঞতা থেকে আসা, এটি কাজ করবে না। :)


ভিবি নেটনের কোড খারাপ নয়! আমরা যারা একাধিক ভাষায় কাজ করি তাদের জন্য কোডটি সি থেকে রূপান্তর না করাই ভালো!
স্টিভ রিড জুন

ধন্যবাদ, এটি আমাকে স্বয়ংক্রিয়ভাবে কোনও পরিষেবা কীভাবে শুরু করবেন তা নির্ধারণে সহায়তা করেছে।
চার্লস ওভেন

0

সবচেয়ে সহজ সমাধানটি এখানে পাওয়া যায় @ হোওং লং -এর ইনস্টল-উইন্ডোজ-পরিষেবা-ইনস্টল-ইনস্টল-ছাড়াই

@echo OFF
echo Stopping old service version...
net stop "[YOUR SERVICE NAME]"
echo Uninstalling old service version...
sc delete "[YOUR SERVICE NAME]"

echo Installing service...
rem DO NOT remove the space after "binpath="!
sc create "[YOUR SERVICE NAME]" binpath= "[PATH_TO_YOUR_SERVICE_EXE]" start= auto
echo Starting server complete
pause
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.