寻找API到SC.exe实用程序,以及有关自我更新Windows服务的建议
我们构建了一个在客户端计算机上运行的Windows服务,它偶尔会下载更新版本的自身,然后执行自我更新:安装新服务,启动它,停止旧服务,最后删除它。该服务无法直接停止并执行其他操作,因此它会旋转另一个可执行文件,从而完成一些工作。实现这一点很棘手,当使用较新的.Net Framework构建较新的服务时(例如最近从.Net 2.0切换到.net 4.0),这一点尤其糟糕。问题是.Net 2.0库无法在.Net 4.0服务上运行。
现在,一种方法是让旧版本的服务旋转一个辅助程序,该程序随新版本一起提供,但是...如果它的行为以破坏方式改变怎么办?我觉得不要混淆版本更安全,即使有些东西通常保持不变 - 有助于降低设计复杂性。
现在,似乎有一种.Net版本中立的Windows服务操作方式:
sc.exe
工具:http://support.microsoft.com/kb/251192
我想知道这是不是我正在寻找的银弹。现在,因为我将以编程方式调用此人并检查错误,所以我不妨使用API。理想情况下,我会有一个本机C ++项目,它编译为与SC.exe接口的本机exe。这可能吗?如果没有,那么我该如何在不同的计算机上找到sc.exe呢?它们可以是32位或64位,并运行从Win XP SP2 / 3开始的任何版本的Windows。
如果您对我的问题或一些巧妙的想法有疑问,或者对我在这里提出的确切问题的答案,请告诉我。
编辑:如果我尝试使用2.0代码安装4.0服务,我会得到与我一样的错误:
> C:WindowsMicrosoft.NETFrameworkv2.0.50727InstallUtil.exe MyService4.exe
Microsoft(R).NET Framework
安装工具版本
2.0.50727.4927版权所有(c)Microsoft Corporation。版权所有。
初始化时发生异常
安装:
System.BadImageFormatException:可以
不加载文件或程序集
'file:/// [path] MyService4.exe'或者一个
它的依赖关系。这个组件是
由比运行时更新的运行时构建的
当前加载的运行时并不能
装..
没有找到相关结果
已邀请:
4 个回复
漂汀拦
公藕
类能够控制任何服务,甚至是本地服务。我没有尝试过,但我相信
类也可以用来(un)安装任何服务。 如果
和
不符合您的需求,我建议直接包装本机API而不是
。 MSDN文档应该让你开始;您将需要服务控制管理器功能。
程序只是SCM API的一个瘦命令行包装器。
磐剩
类中遇到的最大问题是缺乏对更新服务功能的支持,例如描述和故障/恢复操作。为了解决这个问题,我从CodeProject调整了Narendra(Neil)Baliga的代码并使用了
类。他的代码包含了调用相同的Windows API所需的p调用定义。 有点相关:如果您的更新要求与我之前使用的相似,我建议安装到并排文件夹(其名称包括版本/版本号),并保留最后2或3以允许回滚。将当前版本的路径传递给设置工具,以便了解当前的播放状态。
蹄渭信妥扳