如何使用C#从Windows服务运行EXE程序?

如何EXE使用C#从Windows服务运行程序?


这是我的代码:


System.Diagnostics.Process.Start(@"E:\PROJECT XL\INI SQLLOADER\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2\bin\Debug\ConsoleApplication2.exe");

当我运行此服务时,该应用程序未启动。

我的代码有什么问题?



倚天杖
浏览 1993回答 3
3回答

BIG阳

这将永远行不通,至少在Windows Vista或更高版本中不行。关键问题是您试图从Windows服务而不是标准Windows应用程序中执行此操作。您显示的代码将在Windows Forms,WPF或控制台应用程序中完美运行,但在Windows Service中根本无法运行。Windows Services无法启动其他应用程序,因为它们未在任何特定用户的上下文中运行。与常规Windows应用程序不同,服务现在在隔离的会话中运行,并且禁止与用户或桌面进行交互。这样就没有地方可以运行该应用程序。这些相关问题的答案提供了更多信息:引发Timer事件时,Windows Service如何启动进程?Windows中的哪个进程是用户特定的?Windows服务(允许与桌面交互的服务)到目前为止,您可能已经发现,解决问题的最佳方法是创建一个标准的Windows应用程序而不是服务。这些文件设计为由特定用户运行,并与该用户的桌面相关联。这样,您可以使用已经显示的代码随时运行其他应用程序。假设您的控制台应用程序不需要任何接口或任何输出,另一种可能的解决方案是指示该过程不要创建窗口。这将防止Windows阻止您创建进程,因为它将不再请求创建控制台窗口。您可以在有关相关问题的答案中找到相关代码。

蛊毒传说

您可以从Windows任务计划程序中使用此工具,有许多类似TaskScheduler的库可以为您提供帮助。例如,考虑我们要计划一个任务,该任务将在五秒钟后执行一次:using (var ts = new TaskService())        {            var t = ts.Execute("notepad.exe")                .Once()                .Starting(DateTime.Now.AddSeconds(5))                .AsTask("myTask");        }notepad.exe将在五秒钟后执行。有关详细信息,请访问Wiki。如果您知道该程序集中需要哪个类和方法,则可以这样自己调用它:        Assembly assembly = Assembly.LoadFrom("yourApp.exe");        Type[] types = assembly.GetTypes();        foreach (Type t in types)        {            if (t.Name == "YourClass")            {                MethodInfo method = t.GetMethod("YourMethod",                BindingFlags.Public | BindingFlags.Instance);                if (method != null)                {                    ParameterInfo[] parameters = method.GetParameters();                    object classInstance = Activator.CreateInstance(t, null);                    var result = method.Invoke(classInstance, parameters.Length == 0 ? null : parameters);                    break;                }            }        }
打开App,查看更多内容
随时随地看视频慕课网APP