2014-12-09 3 views
0

Итак, я создал визуальное решение студии 2013 года с двумя проектами C# в нем, одним приложением Win form и одним окном. Я использую расширенный установщик 11.6 для создания моего установочного пакета, я специально использую встроенную функцию установки службы, которая, кажется, работает нормально.Структура службы Windows с настольным графическим приложением

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

Проблема в том, что я определенно не правильно структурирован, и я могу неправильно использовать трубы, поэтому мне нужен совет. Я думаю, что мой сервис работает только как скрипт в настоящий момент, хотя я не уверен. Также похоже, что команда из приложения win forms не просто пытается отправить данные в службу, но, похоже, пытается запустить новый экземпляр службы (получение ошибки о том, что служба не может быть запущена с командной строки или отладчика ... но это не должно быть * Запуск чего-либо из формы выигрыша).

В любом случае, вот код метода в форме выигрыша, который отправляет данные в службу.

Win Form Метод

private void pipe_server(byte _command) 
    { 
     //create streams 
     var sender = new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable); 

     //start client, pass pipe ids as command line parameter 
     string clientPath = @"C:\\test\\My_Service.exe"; 
     string senderID = sender.GetClientHandleAsString(); 

     var startInfo = new ProcessStartInfo(clientPath, senderID); 
     startInfo.UseShellExecute = false; 
     Process clientProcess = Process.Start(startInfo); 

     //release resources handlet by client 
     sender.DisposeLocalCopyOfClientHandle(); 

     //write data 
     sender.WriteByte(_command); 
    } 

А вот сервис.

public partial class My_Service : ServiceBase 
{ 
    public My_Service() 
    { 
     InitializeComponent(); 
    } 

    static void Main(string[] args) 
    { 
     System.ServiceProcess.ServiceBase[] ServicesToRun; 

     //Change the following line to match. 
     ServicesToRun = new 
      System.ServiceProcess.ServiceBase[] { My_Service() }; 
     System.ServiceProcess.ServiceBase.Run(ServicesToRun); 

     pipe_client(args); 
    } 

    //method that listens for commands from the GUI and parses them 
    static void pipe_client(string[] args) 
    { 
     string parentSenderID; 

     //get pipe handle id 
     parentSenderID = args[0]; 

     //create streams 
     var receiver = new AnonymousPipeClientStream(PipeDirection.In, parentSenderID); 

     //read data 
     int dataReceive = receiver.ReadByte(); 

     //parse commands 
     if (dataReceive == 1) 
     { 
      do_method_1(); 
     } 

     else if (dataReceive == 2) 
     { 
      do_method_2(); 
     } 

     else if (dataReceive == 3) 
     { 
      do_method_3(); 
     } 
    } 
} 
+0

Для начала было бы неплохо проверить, работает ли ваш метод связи WinForms-> WinForms. Это может упростить отладку, если вы сначала попробуете это. –

+0

Также, начиная с my_service.exe из приложения форм? Если вы используете службу Windows, управление жизненным циклом осуществляется SCM (google it), а не напрямую вами. И если вы запустите my_service.exe, он запустит второй экземпляр и т. Д. И т. Д. –

+0

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

ответ

-1

пример находится здесь поможет вам добиться того, что вы хотите сделать: MSDN

Все это выглядит, как вам нужно сделать, это создать некоторую форму цикла опроса потока для конкретных команды. В представленном примере показано, как настроить StreamReader и цикл do, который проверяет строку, вытащенную из команды StreamReader.ReadLine(), пока не будет обнаружено что-то.

//method that listens for commands from the GUI and parses them 
static void pipe_client(string[] args) 
{ 
    string parentSenderID; 

    //get pipe handle id 
    parentSenderID = args[0]; 

    //create streams 
    var receiver = new AnonymousPipeClientStream(PipeDirection.In, parentSenderID); 

    using (StreamReader sr = new StreamReader(receiver)) 
    { 
       // Display the read text to the console 
       string temp; 

       // wait for message from server. 
       do 
       { 
        Console.WriteLine("waiting for message..."); 
        temp = sr.ReadLine(); 
       } 
       while (!<temp in some check variable or array>); 

       switch(temp) 
       { 
        handle everything here. 
       } 
    } 
} 
+1

OP требует именованных труб, а не анонимных труб. –

+0

Но он пишет услугу, поэтому служба, с которой он общается, не будет иметь отношения родитель-ребенок с графическим интерфейсом. – dsolimano

+0

Вы верны, после дальнейшего расследования по этому вопросу мой ответ недействителен. – impr0t