C# Добавить команды в длительный размещенный сеанс PowerShell после вызова Invoke()
Я пытаюсь (в конце концов) написать служебную оболочку C# для долго работающих приложений .exe, таких как криптоузлы или игровые серверы. До сих пор я написал небольшой хост PowerShell, который выводит вывод .exe (в настоящее время на консоль, в конечном итоге он перейдет в другое место) и небольшой пример приложения, которое выводит время каждую секунду и находится в
Такие программы, как игровые серверы, часто имеют доступные команды, такие как «сохранить» или «выйти», для управления сервером. После того, как программа будет запущена в размещенном сеансе PowerShell, я хотел бы добавить команду «stop», чтобы остановить пример приложения, но я не могу понять, как это сделать.
Я нацеливаюсь
Ниже мой код
Хостинговая программа
Обратите внимание, что строка 15,
using System;
using System.Management.Automation;
namespace ServiceWrapper
{
class Program
{
static void Main(string[] args)
{
// Create the hosting session
var ps = PowerShell.Create();
ps.AddScript("& C:\\Code\\SimpleServiceWrapper\\TestApplication\\SampleApp.exe");
// Hook the output
var output = new PSDataCollection<PSObject>();
output.DataAdded += new EventHandler<DataAddedEventArgs>(InformationEventHandler);
ps.Invoke(null, output);
Console.WriteLine("Started");
// This code is not run
Console.WriteLine("Attempting stop");
ps.AddStatement().AddCommand("stop");
ps.Invoke();
}
// Write output live to the console
static void InformationEventHandler(object sender, DataAddedEventArgs e)
{
var myp = (PSDataCollection<PSObject>)sender;
var results = myp.ReadAll();
foreach (PSObject result in results)
{
Console.WriteLine(result.ToString());
}
}
}
}
Образец заявки
Цель этого небольшого приложения - смоделировать программу, которая работает в течение длительного времени (например, игровой сервер) и требует некоторого ввода (например, «стоп») для правильного выхода из программы. Это предусмотрено в основном для полноты
using System;
using System.Timers;
namespace SampleApp
{
class SampleApp
{
static void Main(string[] args)
{
// Setup a simple 1 second timer
var timer = new Timer(1000) { AutoReset = true };
timer.Elapsed += TimerElapsedEventHandler;
timer.Start();
// loop until told to stop
var loop = true;
while (loop)
{
var stop = Console.ReadLine();
if (stop.ToLower() == "stop")
{
loop = false;
Console.WriteLine("Stopping");
}
}
}
// Every 1 second, write the time
private static void TimerElapsedEventHandler(object sender, ElapsedEventArgs e)
{
Console.WriteLine(DateTime.Now);
}
}
}
Поскольку в программе-примере для правильной остановки необходимо прочитать слово «стоп», как мне отправить это программно после