Итак, я создал визуальное решение студии 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();
}
}
}
Для начала было бы неплохо проверить, работает ли ваш метод связи WinForms-> WinForms. Это может упростить отладку, если вы сначала попробуете это. –
Также, начиная с my_service.exe из приложения форм? Если вы используете службу Windows, управление жизненным циклом осуществляется SCM (google it), а не напрямую вами. И если вы запустите my_service.exe, он запустит второй экземпляр и т. Д. И т. Д. –
Хорошо, как я могу просто ссылаться на существующий экземпляр службы. Служба устанавливается как часть пакета MSI, созданного расширенным установщиком, и запускается автоматически. Служба действительно устанавливается правильно, и я вижу, что она работает, и в списке в разделе services.msc. Но я не знаю, как отправить эту команду в существующий экземпляр службы. –