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-файл или выполнить методы и привязку к событиям