我有一个用C#编写的Windows服务,我需要从中运行控制台应用程序。控制台应用程序也用c#编写。
当不是从Windows服务运行控制台应用程序时,它运行正常。当它从ws中运行时,它什么也没做,它应该工作10到20秒,我在调试代码中看到立即执行。
我使用以下代码启动控制台应用程序:
proc.Start(fullPathToConsole, args); proc.WaitForExit();
控制台的路径是正确的,当我尝试从cmd或仅在资源管理器(无args)中运行它时,它工作正常。但是使用该服务运行后,我看不到任何效果。
我已经尝试过访问服务属性,并赋予它访问桌面的权限,并且可以在系统和用户下运行(也在服务属性中指定)。一切保持不变。
另外:我知道服务没有用户界面,我也不需要。我希望服务运行控制台应用程序。无需从中获取任何数据或使用ui这样的控制台,只需运行它即可完成其工作。
更新一:发现,运行calc或任何其他Windows应用程序都很容易。但是仍然无法运行cmd或任何控制台应用程序。实际上,我需要在XP SP2和Windows 2003 Server上运行它。因此,无论如何都不需要与Vista进行交互。
如有任何评论,我们将非常高兴!
从Windows Vista开始,服务无法与桌面交互。您将无法看到从服务启动的任何窗口或控制台窗口。请参阅此MSDN论坛线程。
在其他操作系统上,服务选项中提供了一个选项,称为“允许服务与桌面交互”。从技术上讲,即使您不在Vista上使用它,也应该为将来编程,并应遵循Vista准则。
如果您仍然想运行一个永远不会与桌面进行交互的应用程序,请尝试指定不使用外壳程序的过程。
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该程序将不使用外壳程序(在Vista中无法访问该外壳程序以进行服务)。
其次,将所有控制台交互重定向到内部流(请参阅process.StandardInput和process.StandardOutput。
process.StandardInput
process.StandardOutput