Windows服务启动失败:无法从命令行或调试器启动服务。

91

嗨,我遇到了这个错误:

无法从命令行或调试器启动服务。必须首先使用installutil.exe安装Windows服务,然后使用ServerExplorer、Windows服务管理工具或NET START命令启动。

但我不明白为什么会出现这个错误。以下是我的代码:

{
    string Hash = "";
    string connectionstring = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
    SqlConnection myConnection = new SqlConnection(connectionstring);
    SqlCommand myCommand = new SqlCommand("GetNullHash", myConnection);
    myCommand.CommandType = CommandType.StoredProcedure;
    myConnection.Open();
    SqlDataReader rdr = myCommand.ExecuteReader();

    while (rdr.Read())
    {
        string filename = @"\\" + rdr.GetString(3);
        filename = System.IO.Path.Combine(filename, rdr.GetString(2));
        filename = System.IO.Path.Combine(filename, rdr.GetString(1));
        Hash = rdr.GetString(0);
        Hash = computeHash(filename);

    }
    myConnection.Close();
    return Hash;
}
6个回答

132

观看 这个视频,我有同样的问题。他向你展示如何调试服务。

以下是他在使用Visual Studio 2010/2012中的基本C# Windows服务模板时的说明。

您需要将此内容添加到Service1.cs文件中:

public void onDebug()
{
    OnStart(null);
}

如果你处于DEBUG活动解决方案配置中,你需要将Main()更改为以这种方式调用你的服务。

static void Main()
{
    #if DEBUG
    //While debugging this section is used.
    Service1 myService = new Service1();
    myService.onDebug();
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);

    #else
    //In Release this section is used. This is the "normal" way.
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] 
    { 
        new Service1() 
    };
    ServiceBase.Run(ServicesToRun);
    #endif
}

请记住,这是一种非常棒的调试服务的方式。但是,它不会调用OnStop(),除非您像在onDebug()函数中调用OnStart(null)那样显式地调用它。


有人给了我一个“显而易见”的提示,说:像在普通的可调试应用程序中一样开发您的类,然后在您觉得该类已准备好时将其导入到您的服务中。 - Cesar
我所做的是在Timer.Start()之后的OnStart方法中放置需要调试的函数,这样我就可以进行调试了。 - JD - DC TECH
你救了我的一天!非常感谢。 - Kalyani Ramamurthy
太好了!不需要依附进程!;) - Willy
谢天谢地... InstallUtil.exe 已经让我抓狂了。 - else

39

手动安装您的服务

要手动安装或卸载使用.NET Framework创建的Windows服务,请使用实用程序InstallUtil.exe。此工具可以在以下路径找到(使用适当的框架版本号)。

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe

要安装

installutil yourproject.exe

卸载

installutil /u yourproject.exe

参考: 如何:安装和卸载服务 (Microsoft)

以编程方式安装服务

要使用C#以编程方式安装服务,请参阅以下类ServiceInstaller (c-sharpcorner)


这个方法完美地解决了我的问题,我有一个有问题的服务器,需要紧急运行该服务。我使用这个步骤在我的本地机器上配置了该服务,请确保使用具有所需权限的正确用户进行配置。 - kolexinfos
7
运行了installutil命令后,显示安装成功,但我仍然无法启动服务或在服务管理器中看到它。 - Bassie
2
我发誓,我在网上找到的每个MSDN链接都是失效的。MS文档是为什么在回答中包含相关信息很重要的典型案例。(而您在这方面做得非常好!谢谢!) - Woodrow Barlow

1

您的代码与服务安装无关,这不是问题所在。

为了测试服务,您必须按照指示进行安装。

有关安装您的服务的更多信息:安装和卸载服务


0

前往 App.config 配置文件

查找

<setting name="RunAsWindowsService" serializeAs="String">
    <value>True</value>
  </setting>

设置为False


这个设置有在线文档吗?我应该在哪里添加它?我尝试了applicationSettings,但没有效果。 - bornfromanegg

0

我建议创建一个安装程序项目,因为在部署时这似乎是最方便的方式,没有手动复制文件的烦恼。请参考Windows服务安装程序教程,你就会知道如何创建它。这个实例是针对vb.net的,但对于任何类型都是一样的。


0

安装:

打开CMD并输入{YourServiceName} -i,安装完成后输入NET START {YourserviceName}启动服务。

卸载:

打开CMD并输入NET STOP {YourserviceName},停止服务后输入{YourServiceName} -u即可卸载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接