我有一个用 C# 编写的 Windows 服务,我需要从它运行一个控制台应用程序。 控制台应用程序也是用 c# 编写的。
当控制台应用程序不是从 Windows 服务运行时,它运行良好。当它从 ws 运行时,它没有做任何它应该做的事情,因为它应该工作 10-20 秒,我在调试代码中看到它被立即执行。
我正在使用以下代码启动我的控制台应用程序:
proc.Start(fullPathToConsole, args);
proc.WaitForExit();
控制台的路径是正确的,当我尝试从 cmd 或只是在资源管理器(没有 args)中运行它时,它工作正常。但是在运行该服务后,我看不到任何效果。
我已经尝试转到服务属性并授予它访问桌面的权限,并在系统和我的用户(也在服务属性中指定)下运行。一切都保持不变。
补充:我知道服务没有用户界面,我也不想要。我想让服务运行控制台应用程序。无需从中获取任何数据或使用此控制台(如 ui),只需运行它即可完成工作。
更新 I:发现运行 calc 或任何其他 Windows 应用程序很容易。但仍然无法运行 cmd 或任何控制台应用程序。实际上我需要在 XP SP2 和 Windows 2003 Server 上运行它。因此无论如何都不需要与 Vista 交互。
很高兴收到任何评论!
最佳答案
从 Windows Vista 开始,服务无法与桌面交互。您将看不到任何从服务启动的窗口或控制台窗口。看这个MSDN forum thread .
在其他操作系统上,服务选项中有一个选项可用,名为“允许服务与桌面交互”。从技术上讲,您应该为 future 编程并且应该遵循 Vista 指南,即使您不在 Vista 上使用它也是如此。
如果您仍想运行从不与桌面交互的应用程序,请尝试指定进程不使用 shell。
ProcessStartInfo info = new ProcessStartInfo(@"c:\myprogram.exe");
info.UseShellExecute = false;
info.RedirectStandardError = true;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.CreateNoWindow = true;
info.ErrorDialog = false;
info.WindowStyle = ProcessWindowStyle.Hidden;
Process process = Process.Start(info);
看看这是否有效。
首先,您通知 Windows 该程序不会使用 shell(在 Vista 中无法访问以提供服务)。
其次,您将所有控制台交互重定向到内部流(参见 process.StandardInput
和 process.StandardOutput
。
关于c# - 如何从 Windows 服务运行控制台应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1369236/