r.abhaysinghania Ответов: 3

Я получаю ошибку, которая не может запустить службу из командной строки или debbuger


windows service should be first install and then started with server explorer,administrative tools or the net start command


это ошибка, с которой я столкнулся. Я попытался запустить службу из computer management-service и application, запустив cmd через права администратора.
ниже я прикрепляю свой код.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;

namespace WindowsService1
{
    public partial class Service1 : ServiceBase
    {
        private Timer timer1 = null;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            timer1 = new Timer();
            this.timer1.Interval = 60000; //60 sec
            this.timer1.Elapsed +=new System.Timers.ElapsedEventHandler(this.timer1_Tick);
            timer1.Enabled=true;
            Library.WriteErrorLog("test windows service started");
            
        }

        protected override void OnStop()
        {
            timer1.Enabled = false;
            Library.WriteErrorLog("Test Service ended");
        }

        public void timer1_Tick(object sender, ElapsedEventArgs e)
        {
            //job
            var result = RunProcess(@"c:\", "webupknvp.Bat", "", false);
            if (result == 0)
            {
                // success
                Console.WriteLine("Sucess");
            }
            else
            {
                // failed ErrorLevel / app ExitCode
                Console.WriteLine("failed try again");
                
            }
            

        }

        public int RunProcess(string workDir, string appName, string args, bool hide = false)
            {
                    
                    Process proc = null;
                    proc = new Process();          
                    string batrun = string.Format("cmd.exe", "/c" + @"C:\Abhay\batfile"); // or @"C:\Abhay\batfile" in the end ("cmd.exe", "/c" + @"C:\Abhay\batfile")
                    proc.StartInfo.UseShellExecute = false;   //addition   	
                    proc.StartInfo.WorkingDirectory = workDir;//batrun
	                proc.StartInfo.FileName = appName;
                    proc.StartInfo.Arguments = args;
	                proc.StartInfo.CreateNoWindow = hide;
                    
	                proc.Start();
	                proc.WaitForExit();
	
	                return proc.ExitCode;
               }
    }
}


библиотечные классы

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace WindowsService1
{
    public static class Library
    {
        public static void WriteErrorLog(Exception ex)
        {
            StreamWriter sw = null;
            try
            {
                sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\ Logfile.txt", true);
                sw.WriteLine(DateTime.Now.ToString() + ":" + ex.Source.ToString().Trim() + ";" + ex.Message.ToString().Trim());
                sw.Flush();
                sw.Close();

            }
            catch
            {

            }
        }

        public static void WriteErrorLog(string Message)
        {
            StreamWriter sw = null;
            try
            { 
            
                sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\ Logfile.txt", true);
                sw.WriteLine(DateTime.Now.ToString() + ":" + Message);
                sw.Flush();
                sw.Close();
            }
            catch
            {

            }
        }
    }
}


программы.в CS


using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace WindowsService1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Service1() 
            };
            ServiceBase.Run(ServicesToRun);
           
        }
    }
}


Что я уже пробовал:

I have tried starting the service from computer management - service and application, running cmd through admin rights.

[no name]

служба windows должна быть сначала установлена, а затем запущена с помощью проводника сервера, средств администрирования или команды net start

3 Ответов

Рейтинг:
28

johannesnestler

комментарии других хороши и правильны. я просто не хочу делиться подходом,который я использую при разработке служб Windows.

Я не хочу unistall/install Service для быстрого тестирования во время отладки, поэтому я запускаю их как консольные приложения.

Поэтому я использую

Environment.UserInteractive
чтобы проверить, запускаюсь ли я от взаимодействия с пользователем (например, во время отладки или просто нажав на exe в WindowsExplorer)-> Если true, я запускаю службу как консоль, вызывая OnStart-метод службы по отражению...
Так что мое решение выглядит так (комментарии и отслеживания опущено)

Где-то в вспомогательной библиотеке (она универсальна и будет работать для всех служб - просто попробуйте):

public static void RunServices(ServiceBase[] aServicesToRun, string[] astrArgs)
{
    if (Environment.UserInteractive)
    {
        // run as console
        try
        {
            CallServiceMethod(aServicesToRun, "OnStart", new object[] { astrArgs });
            WaitPrompt(aServicesToRun);
            CallServiceMethod(aServicesToRun, "OnStop", null);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Service-call failed: " + ex.ToString());
            Console.ReadKey(true);
        }
    }
    else
    {
        // run as Windows service
        ServiceBase.Run(aServicesToRun);
    }
}



static void CallServiceMethod(ServiceBase[] aServicesToRun, string strMethodName, object[] aobjParams)
{
    Type type = typeof(ServiceBase);
    BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
    MethodInfo method = type.GetMethod(strMethodName, flags);

    foreach (ServiceBase service in aServicesToRun)
        method.Invoke(service, aobjParams);
}


private static void WaitPrompt(ServiceBase[] aServicesToRun)
{
    ConsoleKeyInfo key;

    do
    {
        key = Console.ReadKey(true);

        switch (key.Key)
        {
            case ConsoleKey.P:
                CallServiceMethod(aServicesToRun, "OnPause", null);
                Console.WriteLine("Action> PAUSE");
                break;
            case ConsoleKey.R:
                CallServiceMethod(aServicesToRun, "OnContinue", null);
                Console.WriteLine("Action> RESUME");
                break;
            case ConsoleKey.S:
                 // Service-Method OnStop will be called after this method ends
                 Console.WriteLine("Action> STOP");
                break;
        }
    } while (key.Key != ConsoleKey.S);
}


Затем в моей сервисной реализации я использую его следующим образом:

static void Main(string[] astrArgs)
{
    ServiceExecutionHelper.RunServices(new ServiceBase[] { new MyService() }, astrArgs);
    // replaces ServiceBase.Run(...);
}


Может быть, и тебе пригодится...


Graeme_Grant

5ед! :)

r.abhaysinghania

что такое помощник по выполнению службы? как я получаю ошибку в этом

johannesnestler

просто мой вспомогательный класс, куда я помещаю метод - просто создайте статический класс и назовите его так, как вам нравится помещать туда метод RunServices... Я думал, что это очевидно-извините за это...

r.abhaysinghania

Я понял это позже и его запуск спасибо

Рейтинг:
2

Jochen Arndt

Сначала вы должны установить свою службу (см., например, в конце статьи CodeProject, приведенной в решении 1).

Затем запустите его, используя один из методов, упомянутых в сообщении об ошибке.

См. эти ссылки для запуска и остановки служб из командной строки:
Управление службой с помощью SC (Windows)[^]
Чистый старт[^]


r.abhaysinghania

Я сделал это. cmd сделал откат назад и сказал, что служба уже установлена

На этапе установки произошло исключение.
Система.ComponentModel. Win32Exception: указанная служба уже существует

Начинается этап отката установки. Просмотрите содержимое файла журнала о ходе сборки C: \ Users \ Sapuser \ Documents \ Visual Studio 2013 \ Projects \ WindowsService1 \ WindowsService1 \ bin \ Debug \ WindowsService1.exe. Файл находится в папке C: \ Users \ Sapuser \ Documents \ Visual Studio 2013 \ Projects \ WindowsService1 \ WindowsService1 \ bin \ Debug \ WindowsService1.InstallLog. Откат сборки 'C: \ Users \ Sapuser \ Documents \ Visual Studio 2013 \ Projects \ WindowsService1 \ WindowsService1 \ bin \ Debug \ WindowsService1.exe'. Затронутые параметры: logtoconsole = assemblypath = C: \ Users \ Sapuser \ Documents \ Visual Studio 2013 \ Projects \ WindowsService1 \ WindowsService1 \ bin \ Debug \ WindowsService1.exe logfile = C: \ Users \ Sapuser \ Documents \ Visual Studio 2013 \ Projects \ WindowsService1 \ WindowsService1 \ bin \ Debug \ WindowsService1.InstallLog Восстановление журнала событий до предыдущего состояния для исходного WinService. Этап отката успешно завершен. Транзакционная установка завершена. Установка не удалась, откат выполнен.

Jochen Arndt

Если вы уже установили более старую версию службы и хотите обновить ее, сначала удалите старую версию:

одним из наиболее важных системных /у &ЛТ;ваш_проект&ГТ;.EXE-файл

См. также https://msdn.microsoft.com/en-us/library/sd8zc8ha(v=против 110). aspx

Я также рекомендую не устанавливать двоичный файл из пути сборки вашего проекта, а скопировать его в другое место и установить. Затем вы можете перестроиться, пока служба активна.

Рейтинг:
0

Graeme_Grant

Это может помочь: Создание простой службы Windows на C#[^]