2011-02-09 3 views
7

Я хотел бы создать и управлять приложением Windows Service без «помощи» от дизайнера Visual Studio.Служба Windows без вмешательства Visual Studio

Поскольку это .NET, и, судя по MSDN и что делает дизайнер, это означает, унаследовав от Installer, и строительство и дело с ServiceProcessInstaller и ServiceInstaller, чтобы иметь возможность управлять выполнением установки, время работы Serivce.

времени выполнения, это означает создание ServiceBase подкласса и запуск его от Main использования ServiceBase.Run (и доминирующих различных метод обработки событий ServiceBase).

Однако, когда я это делаю, Visual studio настаивает на обработке подклассов и ServiceBase как отредактированных дизайнером файлов. Это не совсем точно читаемо, не говоря уже о том, что он вообще не может иметь дело с рукописным кодом. Я хотел бы избежать конструктора, чтобы держать вещи управляемыми (чтобы избежать туманных, кто-знает-что-работает-когда, особенно для кода, который сложно проверить и отлаживать, например, служб Windows, в конце концов должен установить запускаться вообще), а также иметь возможность указывать имя службы во время выполнения, а не во время компиляции - разработчик этого не поддерживает.

Как создать приложение для работы с окнами без всякого gunk?

+2

Вы можете взглянуть на Topshelf проекта - http://topshelf-project.com/ – stuartd

+0

хмм - аккуратное! Выглядит немного переполненным и еще недостаточно зрелым, но если бы я писал новое приложение, я бы определенно его рассмотрел. –

ответ

-1

В.С. добавляет некоторые дополнительные материалы, но я бы не стал беспокоиться об этом. Вот руководство по созданию простой службы вручную в VS2005, оно должно отлично работать и для новых версий.

http://www.codeproject.com/KB/system/WindowsService.aspx

+1

Дизайнер падает, когда 'ServiceName' не является постоянным - и он меняет код, который я написал: мне действительно не нужен дизайнер.Кроме того, код, который он производит, легко в 5 раз больше необходимого кода и гораздо менее понятен. –

+1

Позвольте мне сказать так: есть ли какая-либо * полезная функция для дизайнера, не являющаяся исходным шаблоном, включая требуемые типы? –

2

Ну, просто удалите вызов InitializeComponent() в конструкторе и дизайнер сгенерированный код из ваших волос.

+0

Это не работает: визуальная студия «умна»: неважно, добавили ли вы файл как класс или как компонент - важна иерархия наследования. Если вы наследуете «Installer» и, следовательно, «IComponent», вы получите конструктор, даже если вы изначально создали файл через «Добавить класс». –

+0

Я даже попытался добавить класс бессмыслицы перед 'Installer' - он все еще использует конструктор. A (неудовлетворительное) обходное решение состоит в том, чтобы сделать щелчок правой кнопкой мыши: Открыть-с и выбрать Редактор CSharp и установить это как значение по умолчанию. Это неудовлетворительно, потому что проверка контроля нового источника на другом компьютере потеряет эту настройку пользователя и вернется к дизайну «пожалуйста-mess-up-my-code». –

+1

Я воспроизвожу. Раздражает, не так ли. –

5

Поскольку я часто создавать службы делают это так:

У меня есть общий базовый класс, который выглядит следующим образом:

internal class ServiceRunner : ServiceBase { 
    protected static void Startup(string[] args, ServiceRunner instance, bool interactiveWait) {  
    if (instance == null) 
     throw new ArgumentNullException("instance"); 

    if (Environment.UserInteractive) { 
     instance.OnStart(args); 
     if (interactiveWait) { 
      Console.WriteLine("Press any key to stop service"); 
      Console.ReadKey(); 
     } 
     instance.OnStop(); 
    } 
    else 
     Run(instance); 
} 

Затем я создаю все свои услуги, как это

internal class MyService : ServiceRunner 
{ 
    public MyService() { 
     ServiceName = ConfigurationManager.AppSettings["MyServiceName"]; 
    } 

    private static void Main(string[] args) { 
     Startup(args, new MyService(), true); 
    } 

    protected override void OnStart(string[] args) { 
     base.OnStart(args); 
     ... 
    } 

    protected override void OnStop() { 
     ... 
     base.OnStop(); 
    } 
} 

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

При установке я использую командную строку

sc create ServiceName binPath= C:\...\MyService.exe 

(я не был в состоянии остановить дизайнер из отверстия на двойной щелчок)

8

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

[System.ComponentModel.DesignerCategory("Code")] 
public class MyService : ServiceBase 
{ 

} 
+0

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

+0

Это действительно правильный ответ, работает как чемпион! – Ronald

+1

Работал, но мне пришлось удалить и снова добавить ссылку на 'System.ServiceProcess', прежде чем это вступит в силу. –

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