我想在没有Visual Studio设计人员“帮助”的情况下创建和管理Windows服务应用程序。
由于这是.NET,并且根据MSDN和设计师的行为来判断,这意味着继承Installer
,并构建和处理ServiceProcessInstaller
和ServiceInstaller
以便能够管理安装时执行服务。
运行时,这意味着创建ServiceBase
子类并使用Main
从ServiceBase.Run
启动它(并覆盖各种ServiceBase
事件处理方法。)
然而,当我这样做时,Visual Studio坚持将Installer
和ServiceBase
子类视为设计者编辑的文件。这并不完全有助于提高可读性,更不用说它通常根本无法处理手写代码。 我想避免设计人员让事情变得易于管理(以避免模糊不清谁知道什么时候运行,特别是对于那些测试和调试很棘手的代码,比如毕竟的Windows服务< em>必须安装才能运行),并且能够在运行时而不是在编译时指定服务名称 - 设计者不支持。
如何在没有所有垃圾的情况下创建Windows服务应用程序?
答案 0 :(得分:10)
ServiceBase
源自Component
。要禁用设计器视图,您可以附加属性,如下所示:
[System.ComponentModel.DesignerCategory("Code")]
public class MyService : ServiceBase
{
}
答案 1 :(得分:5)
因为我经常创建服务,所以这样做:
我有一个如下所示的公共基类:
internal class ServiceRunner : ServiceBase {
protected static void Startup(string[] args, ServiceRunner instance, bool interactiveWait) {
if (instance == null)
throw new ArgumentNullException("instance");
if (Environment.UserInteractive) {
instance.OnStart(args);
if (interactiveWait) {
Console.WriteLine("Press any key to stop service");
Console.ReadKey();
}
instance.OnStop();
}
else
Run(instance);
}
然后我创建我的所有服务
internal class MyService : ServiceRunner
{
public MyService() {
ServiceName = ConfigurationManager.AppSettings["MyServiceName"];
}
private static void Main(string[] args) {
Startup(args, new MyService(), true);
}
protected override void OnStart(string[] args) {
base.OnStart(args);
...
}
protected override void OnStop() {
...
base.OnStop();
}
}
现在我可以通过在调试器或命令行中运行它来测试服务。
安装时我使用命令行
sc create ServiceName binPath= C:\...\MyService.exe
(我无法阻止设计师双击打开)
答案 2 :(得分:2)
好吧,只需删除构造函数中的InitializeComponent()调用,设计器生成的代码就不在你的头发中了。
答案 3 :(得分:-1)