2009-04-23 3 views
2

В настоящее время я разрабатываю службу Windows с целью .Net 3.5.Разработка Windows в .Net 3.5

Я имею ряд вопросов с этим:

  1. Хотя у меня есть проект установки в решении его doesent установить службу (платформа перспектива) даже то программа установки завершается успешно. Мне нужно вручную установить службу, используя InstallUtil.exe, которая находится в папке. Net 2.0, а не в папке 3.5.

  2. Я не могу получить доступ к app.config с помощью объекта ConfigrationManager. Я подозреваю, что это связано с тем, что запущенная служба не запускается из каталога установки. Кто-нибудь знает, как мне получить доступ к этому во время работы безопасно?

Любые советы и опыт на эту тему были бы высоко оценены.

Джеймс

ответ

2

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

3

Я недавно сделал это сам, и вот код, который позволит вам передать «/ install» или «/ uninstall» в качестве параметра командной строки для установки вашей службы. Вы можете изменить это, чтобы автоматически установить, если хотите. Он также получает доступ к app.config fine (моя первоначальная служба делает это в своем основном цикле). Как вы можете видеть, я настраиваю его на запуск как конкретный пользователь, но вы можете установить spi.Account = ServiceAccount.LocalSystem; и опустить имя и пароль. Надеюсь, что это поможет:

namespace MyService 
{ 
    public class ServiceMonitor : ServiceBase 
    { 
     private System.ComponentModel.Container _components = null; 
     private static string _service_name = "MyServiceName"; 

     public ServiceMonitor() 
     { 
      InitializeComponent(); 
     } 

     private void InitializeComponent() 
     { 
      this.CanHandlePowerEvent = true; 
      this.CanPauseAndContinue = true; 
      this.CanShutdown = true; 
      this.CanStop = true; 
      this.ServiceName = _service_name; 
     } 

     protected override void Dispose(bool disposing) 
     { 
      if (disposing && _components != null) 
      { 
       _components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     static void Main(string[] args) 
     { 
      string opt = null;    

      if (args.Length >= 1) 
      { 
       opt = args[0].ToLower(); 
      } 


      if (opt == "/install" || opt == "/uninstall") 
      { 
       TransactedInstaller ti = new TransactedInstaller(); 
       MonitorInstaller mi = new MonitorInstaller(_service_name); 

       ti.Installers.Add(mi); 

       string path = String.Format("/assemblypath={0}", Assembly.GetExecutingAssembly().Location); 
       string[] cmdline = { path }; 

       InstallContext ctx = new InstallContext("", cmdline); 

       ti.Context = ctx; 

       if (opt == "/install") 
       { 
        Console.WriteLine("Installing"); 
        ti.Install(new Hashtable()); 
       } 
       else if (opt == "/uninstall") 
       { 
        Console.WriteLine("Uninstalling"); 
        try 
        { 
         ti.Uninstall(null); 
        } 
        catch (InstallException ie) 
        { 
         Console.WriteLine(ie.ToString()); 
        } 
       } 
      } 
      else 
      { 
       ServiceBase[] services; 
       services = new ServiceBase[] { new ServiceMonitor() }; 
       ServiceBase.Run(services); 
      } 
     } 

     protected override void OnStart(string[] args) 
     { 
      // 
      // TODO: spawn a new thread or timer to perform actions in the background. 
      // 
      base.OnStart(args); 
     } 

     protected override void OnStop() 
     { 
      // 
      // TODO: stop your thread or timer 
      // 
      base.OnStop(); 
     } 
    } 

    [RunInstaller(true)] 
    public class MonitorInstaller : Installer 
    { 
     public MonitorInstaller() 
      : this("MyServiceName") 
     { 
     } 

     public MonitorInstaller(string service_name) 
     { 
      ServiceProcessInstaller spi = new ServiceProcessInstaller(); 

      spi.Account = ServiceAccount.User; 
      spi.Password = ConfigurationManager.AppSettings["Password"]; 
      spi.Username = ConfigurationManager.AppSettings["Username"]; 

      ServiceInstaller si = new ServiceInstaller(); 

      si.ServiceName = service_name; 
      si.StartType = ServiceStartMode.Automatic; 
      si.Description = "MyServiceName"; 
      si.DisplayName = "MyServiceName"; 

      this.Installers.Add(spi); 
      this.Installers.Add(si); 
     } 
    } 
} 
1

Как уже сообщалось, вам нужно создать проект установки для установки. Я также написал batch файлов, чтобы сделать это без установки.

Чтобы помочь в создании проекта установки, я нашел следующие ссылки полезными.

How to create a setup project for a Windows Service application in Visual C#

Windows Services in C#: Part 2: Adding an Installer for Your Windows Service

How to: Add Installers to Your Service Application

Смежные вопросы