genese1977 Ответов: 0

C# как динамически загружать службы


Привет
Я хотел бы динамически загружать службы из основного сервиса.
При взгляде на exe в processExplorer я хотел бы увидеть что-то вроде этого:
- MainService.exe
----- Dispatcher.exe
----- TCPServer.exe
----- Calculator.exe

Я подумывал о создании сервиса в VS. Затем добавьте интерфейс службы, который все остальные подчиненные службы должны реализовать в другом проекте (чтобы указать поведение).
Любой Подсервис, который будет загружен основной службой, реализует этот интерфейс.
Наконец, основная служба проверяет конфигурационный файл, предоставляя asseblyName и пространство имен подчиненных служб для загрузки.

Какой-то псевдокод, сначала основной сервис инициализирует все подсервисы (подсистемы) и запускает сервисы

public partial class MainService : ServiceBase
{
    List<INotifier> _Subsystems = null;
    public RemoCo()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
           foreach(SrvConfig a in ServiceConfig)
           {
                INotifier asm = Assembly.Load("mySubSystem");
                asm.OutgoingResponseSignaled += MessageSentSignal;
                asm.Start();
                _Subsystems.Add(asm);
           }
    }

    private void MessageSentSignal(object sender, INotifierEventArgs e)
    {
        ...
    }

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


Интерфейс, который должен реализовать каждый subservice будет выглядеть как-то так
public interface INotifier
{
    string Name { get; set; }
    void Start();
    void Stop(TimeSpan pTimeout);
    void RequestStopAsync(TimeSpan pTimeToWait);
    void IncomingTask(ITask pTask);
    void IncomingTaskAsync(ITask pTask);
    void OutgoingResponseAsync(IResult pResult);
    void ReadConfig(string pConfigFilePath);
    void HealthPing();

    event ServiceStartedEventHandler ServiceStarted;
    event ServiceStoppedEventHandler ServiceStopped;
    event ServiceStopRequestedEventHandler ServiceStopRequested;
    event IncomingTaskSignaledEventHandler IncomingTaskSignaled;
    event OutgoingResponseSignaledEventHandler OutgoingResponseSignaledSignaled;
}



После того, как все суб-службы будут запущены, я хотел бы сделать такие вещи, как это:
public void SendTCPPacket(string pMessage)
{
    _Subsystems.First(x => x.Name.Equals("TCPServer", System.StringComparison.InvariantCultureIgnoreCase)).IncomingTask(pSendMessageTask);
}


Это должен быть exe-файл, чтобы правильно отображалась иерархия, подслужбы exe под mainservice. Разве такое возможно? Не могли бы вы помочь мне с небольшим примером, если это возможно?

Большое спасибо за вашу помощь

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

попробовал пример кода, как описано выше, но не смог загрузить exe-файл или выполнить методы и привязку к событиям

0 Ответов