Если вы ожидаете увидеть пользовательский интерфейс приложения, которое вы запускаете, вы не будете. Вы не можете запускать пользовательский интерфейс из службы.
Обновление (3/20/2014 5:11 вечера EST): добавлен код для записи «GotHere0.txt». Gothere0, 1, 2, 3 все выглядит нормально. Gothere4 не появляется.
Обратите внимание: это не дубликат - у него очень тонкие различия со всеми существующими нитями, которые я нашел.
Требования:
Результаты:
Process.Start (sInfo) завершается так, как будто все было успешно. Никакие исключения не выбрасываются. Идентификатор процесса> 0. Тем не менее, очевидно, что никакой код внутри testapp.exe не выполняется. Кто-нибудь знает, как я могу это исправить? Благодаря!
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.ServiceProcess;
using System.Threading.Tasks;
namespace TestService
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
System.IO.File.WriteAllText(@"c: empGotHere0.txt", "");
System.Threading.Tasks.Task.Factory.StartNew(() => Run(), TaskCreationOptions.LongRunning);
}
protected override void OnStop()
{
ContinueRunning = false;
}
public static bool ContinueRunning = true;
public void Run()
{
System.IO.File.WriteAllText(@"c: empGotHere1.txt", "");
while (ContinueRunning)
{
try
{
List<string> args = new List<string>();
args.Add("Test");
StartApp(@"c: emp estapp.exe", args);
}
catch (Exception)
{ }
if (ExitEarly()) return;
}
}
private static void StartApp(string exePath, List<string> args)
{
try
{
System.IO.File.WriteAllText(@"c: empGotHere2.txt", "");
ProcessStartInfo sInfo = new ProcessStartInfo();
sInfo.FileName = exePath;
sInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(exePath);
sInfo.Arguments = string.Join(" ", args);
sInfo.CreateNoWindow = false;
Process runningProcess = Process.Start(sInfo);
string message = "";
if (runningProcess!=null)
{
message = runningProcess.Id.ToString();
}
System.IO.File.WriteAllText(@"c: empGotHere3.txt", message);
}
catch (Exception exc)
{
System.IO.File.WriteAllText(@"c: empGotHere4.txt", exc.Message);
}
}
private static bool ExitEarly()
{
// Sleep for a total of 60 seconds, and return if "OnStop" is called.
for (int i = 0; i < 600; i++)
{
System.Threading.Thread.Sleep(100);
if (!ContinueRunning) return true;
}
return false;
}
}
}
Вот код для testapp.exe:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace testapp
{
class Program
{
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
if (args == null || args.Length == 0)
{
sb.AppendLine("NO arguments were passed.");
}
else
{
foreach (string arg in args)
{
sb.AppendLine("Arg: [" + arg + "]");
}
}
System.IO.File.WriteAllText("helloworld.txt", sb.ToString());
}
}
}
c#,windows-services,console-application,windows-server-2008-r2,process.start,