Как сделать службу Windows с параметрами?

Я написал службу Windows, из которой я хочу иметь 1 экземпляр для каждого клиента. Это связано с тем, что у каждого клиента есть своя БД с идентичными схемами; единственная разница между службами Windows заключается в том, что каждый из них будет иметь другой параметр, соответствующий БД клиента, который они предназначены для обслуживания. (И я не могу иметь одну службу с несколькими рабочими потоками, потому что соединение с БД использует статическую переменную, которую я не могу обсуждать с помощью потоков.)

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

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

Как вы это делаете?

Ответы

Ответ 1

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

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

Ответ 2

Все, что я хотел, это отправить один параметр в созданную службу. Как оказалось, все, что вам нужно сделать (осторожно!) Изменить реестр на HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\и добавить параметр в ImagePath после кавычек.

Eg. ImagePath Value Data: "C:\Program Files\myservice\myservice.exe" param1

Я нашел решение в этой ссылке http://social.msdn.microsoft.com/Forums/is/csharpgeneral/thread/38242afa-7e40-4c06-975e-aa97d3cc782f

Ответ 3

Вам в основном нужно установить службу несколько раз и настроить ее с помощью файла exe.config.

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

Обновление

exe.Config - это Файл конфигурации приложения

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

Если нам нужно несколько экземпляров одного из наших сервисов для запуска на одной машине, мы на самом деле устанавливаем его только один раз, а затем буквально копируем установленную папку и меняем имя exe для второго экземпляра. Второй экземпляр затем настроен в собственном файле конфигурации приложения.

Ответ 4

Насколько я знаю, невозможно задать параметры запуска с помощью ServiceInstaller, ServiceProcessInstaller или installutil. Тем не менее, можно указать параметры запуска с помощью некоторого COM api из advapi.dll (проверьте меню слева). Полный набор необходимых вызовов можно найти здесь. Это класс (также), называемый ServiceInstaller, который содержит необходимые внешние методы и некоторые полезные методы.

Вы хотите использовать метод утилиты InstallAndStart. Он принимает имя службы, отображаемое имя и путь к исполняемому файлу, который представляет вашу службу Windows. Вы можете назвать это следующим образом:

InstallAndStart("MyService", "My Service For User 1",
                "c:\\pathtoexe\MyService.exe user1");

Если у вас есть следующая услуга, параметр startupParam получит значение user1.

class Program : ServiceBase
{
    private string startupParam;

    static void Main(string[] args)
    {
        string arg = args[0];
        ServiceBase.Run(new Program(arg));
    }

    public Program(string startupParam)
    {
        this.ServiceName = "MyService";
        this.startupParam = startupParam;
    }
    ...
}

Ответ 5

Если вы используете сторонние инструменты, вы можете попробовать http://installer.codeeffects.com. Они позволяют вам устанавливать установщик .exe для вашей службы Windows и добавлять параметры в пользовательский интерфейс установщика. Кроме того, вам не нужно разрабатывать собственный проект настройки. Надеюсь, это поможет.