Yar*_*lev 29 c# windows-services console-application
我有一个用c#编写的Windows服务,我需要从中运行一个控制台应用程序.控制台应用程序也用c#编写.
控制台应用程序运行时不是从Windows服务运行.当它从ws运行它没有做它应该做的任何事情,因为它应该工作10-20秒我在调试代码中看到立即执行.
我用以下代码启动我的控制台应用程序:
proc.Start(fullPathToConsole, args);
proc.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
控制台的路径是正确的,当我试图从cmd或只是在资源管理器(没有args)运行它时,它工作正常.但在运行该服务后,我认为没有效果.
我已经尝试转到服务属性并授予它访问桌面的权限,并在系统和我的用户下运行(也在服务属性中指定).一切都保持不变.
附加:我知道服务没有ui,我不想要.我希望服务运行控制台应用程序.无需从中获取任何数据或像ui一样使用此控制台,只需运行它就可以完成它的工作.
更新我发现,运行计算或任何其他Windows应用程序很容易.但仍然无法运行cmd或任何控制台应用程序.实际上我需要在XP SP2和Windows 2003 Server上运行它.所以无论如何都不需要与Vista交互.
任何评论都会很高兴!
Pie*_*ant 25
从Windows Vista开始,服务无法与桌面交互.您将无法看到从服务启动的任何窗口或控制台窗口.看到这个MSDN论坛帖子.
在其他操作系统上,服务选项中有一个选项,名为"允许服务与桌面交互".从技术上讲,您应该为未来编程,即使您不在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);
Run Code Online (Sandbox Code Playgroud)
看看这是否成功.
首先,您通知Windows该程序将不使用shell(在Vista中无法访问该服务).
其次,您将所有控制台交互重定向到内部流(请参阅process.StandardInput和process.StandardOutput.
我成功之前就完成了这个 - 我家里有一些代码.当我今晚回到家时,我将使用启动控制台应用程序的服务的工作代码更新此答案.
我以为我会从头开始尝试这个.这是我编写的一些启动控制台应用程序的代码.我将其作为服务安装并运行并且它正常工作:cmd.exe启动(如任务管理器中所示)并持续10秒,直到我发送退出命令.我希望这可以帮助你的情况,因为它在这里按预期正常工作.
using (System.Diagnostics.Process process = new System.Diagnostics.Process())
{
process.StartInfo = new System.Diagnostics.ProcessStartInfo(@"c:\windows\system32\cmd.exe");
process.StartInfo.CreateNoWindow = true;
process.StartInfo.ErrorDialog = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.Start();
//// do some other things while you wait...
System.Threading.Thread.Sleep(10000); // simulate doing other things...
process.StandardInput.WriteLine("exit"); // tell console to exit
if (!process.HasExited)
{
process.WaitForExit(120000); // give 2 minutes for process to finish
if (!process.HasExited)
{
process.Kill(); // took too long, kill it off
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
93774 次 |
| 最近记录: |