控制台应用程序的Process.Start()无法在Server 2008 R2中的Windows服务中运行

时间:2014-03-20 19:40:20

标签: c# windows-services console-application windows-server-2008-r2 process.start

更新(2014年3月20日美国东部时间下午5:11):添加了代码以写入“GotHere0.txt”。 Gothere0,1,2,3都显得很好。 Gothere4没有出现。

请注意 - 这不是重复 - 它与我找到的所有现有主题有非常微妙的差异。

要求:

  1. 从Windows服务启动控制台应用程序,该服务在Windows Server 2008 R2中的本地系统帐户下运行
  2. 控制台应用程序内部的代码写入SQL数据库,并将文件写入驱动器,但不需要用户输入(并且不需要查看或与控制台本身交互)。我们所需要的只是来自控制台应用程序的代码来执行。
  3. 这应该在服务器启动时起作用,而不需要用户登录。
  4. 到目前为止的结果:

    Process.Start(sInfo)完成,好像一切都成功了。没有异常被抛出。 <处理ID>返回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:\temp\GotHere0.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:\temp\GotHere1.txt", "");
                while (ContinueRunning)
                {
                    try
                    {
                        List<string> args = new List<string>();
                        args.Add("Test");
                        StartApp(@"c:\temp\testapp.exe", args);
                    }
                    catch (Exception)
                    { }
    
                    if (ExitEarly()) return;
                }
            }
    
            private static void StartApp(string exePath, List<string> args)
            {
                try
                {
                    System.IO.File.WriteAllText(@"c:\temp\GotHere2.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:\temp\GotHere3.txt", message);
                }
                catch (Exception exc)
                {
                    System.IO.File.WriteAllText(@"c:\temp\GotHere4.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());
            }
        }
    }
    

    enter image description here

1 个答案:

答案 0 :(得分:-1)

如果您希望从正在启动的应用程序中看到UI,则不会。您无法从服务启动UI。