C#守护进程服务无法启动winform程序

鱼dotNet 2017-03-09 06:50:22
用网上的代码写了个守护进程服务:
http://www.cnblogs.com/tianzhiliang/archive/2011/02/12/1952221.html
该进程用来监视我的一个winform程序,当程序挂掉时启动它,但是服务无法成功启动我的程序,错误日志如下:
出现应用程序未处理的异常:2017/3/9 18:17:24
异常类型:InvalidOperationException
异常消息:当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效操作。请指定 ServiceNotification 或 DefaultDesktopOnly 样式,以显示服务应用程序发出的通知。
异常信息: 在 System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
在 System.Windows.Forms.Form.ShowDialog()
在 MapLocalization.MainForm..ctor() 位置 c:\Users\002\Desktop\MapLocalization111 - 副本\MapLocalization\MapLocalization\MainForm.cs:行号 127
在 MapLocalization.Program.Main() 位置 c:\Users\002\Desktop\MapLocalization111 - 副本\MapLocalization\MapLocalization\Program.cs:行号 43


请问各位有什么好的解决办法吗?或者有更好的守护进程的实现方法吗?
...全文
602 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
鱼dotNet 2017-03-13
  • 打赏
  • 举报
回复
引用 13 楼 mjp1234airen4385 的回复:
首先,你要明白,通过windows服务启动一个winform程序是不行的。(就是你现在的情况) 其次,如果你确实需要不登录服务器,就能运行的程序,你要改造你现有的winform程序, 把winform里的功能做成windows服务,然后你再用另一个windows服务来监控这个改造后的服务。 如果你还想要和这个windows服务交互,你就再写一个winform程序,登录服务器以后, 打开winform使用socket或者进程交互等方式实现和windows服务交互。 如果不需要实时的查看服务的运行情况,可以通过数据库,配置文件等方式。
请问可以用控制台程序做监控程序吗?因为调试服务的时候这样是能运行的,除了看到黑框会有什么问题吗?
mjp1234airen4385 2017-03-13
  • 打赏
  • 举报
回复
首先,你要明白,通过windows服务启动一个winform程序是不行的。(就是你现在的情况) 其次,如果你确实需要不登录服务器,就能运行的程序,你要改造你现有的winform程序, 把winform里的功能做成windows服务,然后你再用另一个windows服务来监控这个改造后的服务。 如果你还想要和这个windows服务交互,你就再写一个winform程序,登录服务器以后, 打开winform使用socket或者进程交互等方式实现和windows服务交互。 如果不需要实时的查看服务的运行情况,可以通过数据库,配置文件等方式。
鱼dotNet 2017-03-13
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
另外,网上有些“方法”的前提是你当前正在用远程登录方式登录到服务器上,那些代码才能成功。如果没有用户用远程登录上去了,它实际上会失败的。 不要学那些东西。没用。
不太懂,您的意思是我这边现在要怎么做呢?我现在这个winform的程序是运行在我本机上的,我需要做一些处理保证这个程序一直处于正常运行状态直到人为关闭它,因为后期给到客户那边是实现一个类似24小时监控软件的功能
鱼dotNet 2017-03-13
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
服务里面怎么有窗体启动?不要把界面放在服务里
这些错误是服务启动的winform程序里报出来的,winform的弹出框和界面出不来时报的错误,请问有别的好的方式实现监护我的winform程序吗?
鱼dotNet 2017-03-13
  • 打赏
  • 举报
回复
引用 3 楼 xuggzu 的回复:
楼主的应用不是用来做“服务”的,搞错了使用方式,也就是你网上下的代码不适合你。改用其它方法监控吧。
请问您有什么好的建议吗?
xian_wwq 2017-03-13
  • 打赏
  • 举报
回复
在Windows XP、Windows Server 2003 或早期Windows 系统时代,当第一个用户登录系统后服务和应用程序是在同一个Session 中运行的。从Vista 开始Session 0 中只包含系统服务,其他应用程序则通过分离的Session 运行。 所以如果运行环境是Vista或者更新,直接使用系统服务来监测form程序不可行。 对于简单的交互,服务可以通过WTSSendMessage 函数,在用户Session 上显示消息窗口。对于一些复杂的UI 交互,必须调用CreateProcessAsUser 或其他方法(WCF、.NET远程处理等)进行跨Session 通信,在桌面用户上创建一个应用程序界面。 具体的可以搜“穿透Session0隔离”。 比较简单的方法: 1.使用服务监测服务,也就是13楼所述,lz把自己的工作进程改造成系统服务。 2.设置指定用户自动登录,使用form进程来管理自己的form程序。
threenewbee 2017-03-10
  • 打赏
  • 举报
回复
服务里面怎么有窗体启动?不要把界面放在服务里
  • 打赏
  • 举报
回复
另外,网上有些“方法”的前提是你当前正在用远程登录方式登录到服务器上,那些代码才能成功。如果没有用户用远程登录上去了,它实际上会失败的。 不要学那些东西。没用。
  • 打赏
  • 举报
回复
当你把服务部署到几年前的 win2008R2 或者更新的操作系统上时,多余的钻windows漏洞的做法都会失效。 所以服务本身就要守护同样没有交互的 console 程序、其它服务之类的,就行了!你的桌面程序应该按照桌面程序的做法,远程登录到服务器上启动一个桌面程序,然后“锁定windows”(而不是“注销”)退出服务器即可。
WM_JAWIN 2017-03-10
  • 打赏
  • 举报
回复
通过createprocessasuser启动你的程序,百度一下,一堆代码,粘到你程序上就可以用
炒鸡厉害2022 2017-03-10
  • 打赏
  • 举报
回复
不懂,来学习
stherix 2017-03-09
  • 打赏
  • 举报
回复
因为服务不是运行在当前用户下的,他所启动的程序也不是运行在当前用户下 所以没法显示UI界面 必须通过api以当前用户启动UI才能够正确显示
xuggzu 2017-03-09
  • 打赏
  • 举报
回复
楼主的应用不是用来做“服务”的,搞错了使用方式,也就是你网上下的代码不适合你。改用其它方法监控吧。
巴士上的邂逅 2017-03-09
  • 打赏
  • 举报
回复
一般情况下,服务不能显示窗口,可以通过这个帮助类来实现
Poopaye 2017-03-09
  • 打赏
  • 举报
回复
以 UserInteractive 模式运行

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧