我inheritance了用C#编写的Windows服务。 在罕见的情况下,它失败了。 但是,如何很好地完成还不是很清楚。 Ross Bennett在bytes.com上陈述了这个问题。 为了简单起见,我会在这里引用他的话。 嗨,伙计! 我一直在寻找这个,但我似乎无法动摇任何MSDN或谷歌文件。 我已经在我find的MSDN中查看了关于开发Windows服务的每篇.NET文章。 我正在开发一个Windows服务应用程序。 该服务从系统registry(HKLM)读取其configuration数据,由另一个“pipe理”应用程序存放。 那里没有问题。 该服务使用工作线程来完成其工作。 该线程在OnStart()中创build,并在OnStop()中发送信号/连接/放置。 再次,没有问题。 以下情况下,一切都很好用 系统pipe理员已经正确设置了一切,并且 外网资源全部可达。 但是当然,我们作为开发者根本就不能依靠: 系统pipe理员已经正确设置了一切,或者 外部networking资源可达。 真的,我们需要的是服务应用程序有自己的死亡方式。 如果networking资源瘫痪,我们需要停止服务。 但更重要的是,我们需要SCM知道它已经自行停止了。 供应链pipe理需要知道服务“失败”……并不只是被某个人closures。 在“OnStart()”方法中调用“return”或抛出exception对于仍处于启动过程中的服务甚至没有帮助。SCM快乐地开启并且进程在任务pipe理器中保持运行 – 尽pipe它实际上没有做任何事情,因为工作线程从未被创build和启动。 使用ServiceController实例也不这样做。 SCM看起来像是正常关机 – 而不是服务故障。 因此,没有发生恢复操作或重新启动。 (另外,有一个MSDNful文档警告使用ServiceController来使事情与自身发生有关的ServiceBase后代的危险。) 我已经阅读过文章,人们正在使用PInvoking调用本地代码,只是在SCM中设置“停止”状态标志。 但是这并没有closures服务运行的过程。 我真的很想知道的意图: 在服务内closures服务,在哪里 SCM被专门通知服务已经“停止”了 该过程从任务pipe理器中消失。 涉及ServiceControllers的解决scheme似乎并不合适,如果只是因为2不满意。 (顺便说一下,框架文档明确禁止这样做会带来很大的分量。) 我会很感激任何build议,文档的指针,甚至是合理的猜测。 :-)哦! 我非常乐意接受我错过了这个观点。 最诚挚的, Ross Bennett
我已经阅读了这个问题Inno安装Windows服务? 。 我有同样的问题,但我不明白从lubos hasko的答案。 我到底该怎么办? 你可以有人张贴我完整演练吗? 当我运行下面的代码,安装了一些东西,但在服务列表中,我找不到它。 我有这个,但是这不起作用: using System; using System.Collections.Generic; using System.Configuration.Install; using System.Linq; using System.Reflection; using System.ServiceProcess; using System.Text; using System.IO; namespace ConsoleApplication1 { public class Service1 : ServiceBase { public Service1() { File.AppendAllText("sss.txt", "ccccc"); } protected override void OnStart(string[] args) { File.AppendAllText("sss.txt", "asdfasdf"); } protected override void OnStop() { File.AppendAllText("sss.txt", "bbbbb"); […]
我最近开始使用NuGet来pipe理外部软件包。 现在我只需要它的NLog。 一切工作正常,当我在VS 2012中生成项目。但是,我尝试作为一个CI服务器的TeamCity(我是相当新的CI),它给了我以下错误: [Csc] SomeNamespace\SomeClass.cs(10, 7): error CS0246: The type or namespace name 'NLog' could not be found (are you missing a using directive or an assembly reference?) (这个错误在我使用NLog的地方都会重复) 现在我没有在SVN中包含'packages /'文件夹,因为我认为不包括二进制文件是一个很好的做法,并让TeamCity中的MSBuild自行下载。 但显然不是这样做的。 我在SVN中包含'packages.xml'文件。 我可以检查什么是错误的? 更新感谢@DavidBrabant我被推向了正确的方向。 但是,我现在在TeamCity中出现以下错误: Package restore is disabled by default. To give consent, open the Visual Studio Options dialog, click on Package […]
如何在不使用installutil.exe的情况下以编程方式安装Windows服务? 谢谢
我正在创build一个应用程序的问题。 我试图通过我的C#应用程序启动一个Windows服务。 当我点击我的开始button,它看起来像一切都经过,但是当我login到服务器,该服务仍然不显示它正在运行。 但是,第二次运行它,我得到一个exception,说服务的实例已经运行。 再次login到服务器时,服务似乎停止。 有没有人见过这个? 这是我的代码。 try { while (reader.Read()) { int timeoutMilliseconds = 1000; string serviceName = reader["ServiceName"].ToString(); string permission = reader["Permission"].ToString(); if (permission == "E") { lblServStartSuccess.Visible = true; ServiceController service = new ServiceController(serviceName); TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } else { lblServErrorStart.Visible = true; } } } catch (Exception […]
不知道是否有更好的方法来做到这一点,所以这是问题的原因。 我可以使用下面的代码检查特定机器上是否存在服务: bool DoesServiceExist(string serviceName, string machineName) { ServiceController controller = null; try { controller = new ServiceController(serviceName, machineName); controller.Status; return true; } catch(InvalidOperationException) { return false; } finally { if (controller != null) { controller.Dispose(); } } } 但对我来说这似乎是一个无效的解决scheme(由于exception处理)。 有没有更好的方法来检查服务是否存在。 注意 – 我最近转向.Net 4.0,所以如果有人知道在4.0中更好的解决scheme是可以接受的。 编辑:这是一个示例c#控制台应用程序来testing我的示例以及GetServices代码示例的性能。 在我的testing中,我发现GetServices在服务不存在的情况下性能要好得多,但在服务存在的时候速度要慢两倍: static void Main(string[] args) { string serviceName = […]
有一些Windows服务托pipe的显示名称以通用名称(在这里为国家)开始。 例如: NATION-CITY 民族国家 民族村 是否有一些命令来获得像'NATION-'的所有服务? 最后,我需要使用命令promt停止,启动和重新启动这样的服务。
嗨,我得到这个错误 无法从命令行或debugging器启动服务。 首先必须安装winwows服务(使用installutil.exe),然后使用ServerExplorer,Windows服务pipe理工具或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 […]
我怎样才能在.NET中以编程方式重新启动Windows服务? 另外,当服务重启完成时,我需要做一个操作。
我一直在努力在Haskell中编写Windows服务应用程序。 背景 服务应用程序由Windows服务控制pipe理器执行。 启动后,它会阻止对CallService提供的StartServiceCtrlDispatcher的调用,作为服务的主要function 。 该服务的主要function是应该注册第二个callback来处理传入的命令,如开始,停止,继续等。它通过调用RegisterServiceCtrlHandler 。 问题 我可以写一个程序,它将注册一个服务主要function。 然后,我可以将该程序安装为Windows服务,然后从服务pipe理控制台启动它。 该服务能够启动,报告自己正在运行,然后等待传入的请求。 问题是,我无法让我的服务处理函数被调用。 查询服务状态显示它正在运行,但只要我发送一个“停止”命令窗口popup消息说: Windows could not stop the Test service on Local Computer. Error 1061: The service cannot accept control messages at this time. 根据MSDN文档 ,StartServiceCtrlDispatcher函数将阻塞,直到所有服务报告它们停止。 在调用服务主函数之后,调度程序线程应该等待,直到服务控制pipe理器发送一个命令,此时处理函数应该由该线程调用。 细节 接下来是我正在尝试做的一个非常简化的版本,但它演示了我的处理函数没有被调用的问题。 首先,一些名字和import: module Main where import Control.Applicative import Foreign import System.Win32 wIN32_OWN_PROCESS :: DWORD wIN32_OWN_PROCESS = 0x00000010 […]