我们已经构建了一个在客户端机器上运行的 Windows 服务,它偶尔会下载自己的更新版本,然后执行自我更新:安装新服务,启动它,停止旧服务,并最终将其删除。该服务无法直接停止自身并执行其他操作,因此它会旋转另一个可执行文件,该可执行文件会完成一些工作。做到这一点很棘手,当使用较新的 .Net Framework 构建较新的服务时(例如最近从 .Net 2.0 切换到 .net 4.0),这尤其糟糕。问题是 .Net 2.0 库无法在 .Net 4.0 服务上运行。
现在,一种方法是让旧版本的服务旋转一个新版本附带的帮助程序,但是......如果它的行为必须以一种破坏性的方式改变怎么办?我觉得不混淆版本更安全,即使有些东西通常保持不变 - 有助于降低设计复杂性。
现在,似乎有一种在 Windows 服务上运行的 .Net 版本中立方式:该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:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe MyService4.exe
Microsoft (R) .NET Framework 安装实用程序版本 2.0.50727.4927 版权所有 (c) Microsoft Corporation。版权所有。
初始化安装时发生异常:System.BadImageFormatException:无法加载文件或程序集“file:///[path]\MyService4.exe”或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,并且无法加载。