我有一个Windows服务和一个MSI安装程序(安装项目)。安装项目分别使用/ install和/ uninstall的args进行安装和卸载的自定义操作。
我希望服务在安装后立即启动。我所有的服务都是开始一个过程。服务停止后,它会process.Close();
。
我尝试过做
var sc = new ServiceController( "MyProcess" );
sc.Start();
该过程开始,但是显示服务已启动的事件日志消息未显示。停止时我收到错误Error stopping process: System.InvalidOperationException: No process is associated with this object.
。
如果我不使用服务控制器来启动和使用Services.msc,它会在停止时按预期工作。
有没有办法立即启动流程并让我的启动/停止方法按预期工作?
答案 0 :(得分:1)
您没有说明您正在使用的操作系统,但我记得在去年开发安装程序时遇到此问题。我相信这是Windows 7,Server 2003/2008以及Vista中的安全限制,因为安装程序无法启动它安装的任何应用程序。如果为自动启动设置服务,则应在下次系统重新启动时启动。
答案 1 :(得分:0)
我认为你所说的是这里有两个问题。第一个问题是服务不会在安装时启动。第二个是服务无法启动该过程。我是对的吗?
当我通过安装项目安装服务时,我总是从安装程序类的Commit方法启动服务,这样我知道所有内容都已正确安装。我对此并不是百分之百确定,但在安装提交之前,您可能无法启动该服务。看起来您的自定义操作设置正确,因此调用Commit方法时不应该有任何问题(您确实在自定义操作中包含了提交,对吧?)以下是一个Commit方法的示例我的项目:
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
try
{
var serviceController = new ServiceController("<Insert Service Name>");
serviceController.Start();
}
catch
{
MessageBox.Show(
"There was an error starting the <Insert Service Name> Service. Please manually start it, or restart the computer.");
}
}
通过向用户显示消息框,如果服务启动出现问题,至少会通知用户应该手动启动该服务。在调试安装问题时,您可以在消息框中包含异常,以获取有关具体情况的更多详细信息。
我很好奇 - 您在ServiceProcessInstaller中使用了哪些帐户?此用户是否拥有计算机上启动该过程的权限?流程是否有任何特定的UAC要求?我怀疑访问控制是阻止您的流程启动的原因。
答案 2 :(得分:0)
我最终采取了一种不同的方法,只是获得正在运行的进程,而不是试图保持之前开始的进程。停止进程然后工作正常,并且OnStart / OnStop方法无法正常运行,因为我的内部进程正在开始/停止,就像我需要的那样。