2010-01-26 2 views
1

Я создаю многоразовый framework for building scheduling services с использованием .NET Framework. Мой код распространяется как библиотека, на которую ссылается пользователь в консольном приложении. В основной точке входа приложения пользователю предлагается передать управление статическому методу в библиотеке, который приступит к планированию заданий, если он будет работать в неинтерактивном режиме, а также читать аргументы команды и выполнять задачи обслуживания, такие как установка.Как установить службу Windows без расширения Installer?

Чтобы установить приложение в качестве службы Windows с использованием пространства имен System.Configuration.Install, пользователю необходимо добавить потомок класса Installer в сборку приложения, в котором сообщается инфраструктуре о том, как установить службу. Я бы предпочел сделать это раз и навсегда в библиотеке, но, к сожалению, у установщика класса есть, чтобы быть в сборке приложений.

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

Каковы альтернативы продлению Installer? Могу ли я получить доступ к управляемой структуре установки более прямым образом?

ответ

3

Я использую SC.exe для регистрации бинарного сервиса.

Это оставляет только этот окурок в классе установщика службы:

[RunInstaller(true)] 
public partial class SoapSenderInstaller : Installer 
{ 
    public SoapSenderInstaller() 
    { 
     InitializeComponent(); 
    } 
} 

Вызов sc.exe это просто:

sc create MyService binpath= "C:\Path\to\my\MyService.exe" DisplayName= "My Service Display Name" depend= MSMQ start= auto 

Единственный подводный камень путь sc.exe ожидает его аргументы линии: ввод команды

binpath=[BLANK]"MyService.exe" 

EDIT

Конечно, это решение не соответствует требованию, что пользователю не нужно создавать код, который делает его двоичную службу Windows, потому что, если он просто ссылается на вашу библиотеку, ему все равно нужно наследовать из ServiceBase и реализовать OnStart() и OnStop().

+0

Класс установщика по-прежнему должен находиться в сборке входа, а не в справочной библиотеке, правильно? –

+0

Да, класс установщика находится в сборке, но практически пуст. Я еще не пытался завершить работу с установщиком, но, возможно, это будет возможно, так как это необходимо только InstallUtil. – Filburt

+0

Обратите внимание, что «sc.exe» недоступен в Win2000 (не в установке по умолчанию, но может быть установлен с некоторым набором инструментов от MS). – kibab

0

Я знаю, что вы можете добавить некоторые настраиваемые поля в инсталлятор и потребовать ввода пользователя во время установки, если вы скомпилируете его с помощью Installer.CodeEffects.com. Может быть, потребовав имя пространства имен или типа как строковый ввод от конечного пользователя, вы могли бы загружать или ссылаться на вещи, которые вам нужны «на лету» во время выполнения?

Я ничего не могу придумать в вашей ситуации.

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