服务运行时无法更改服务名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务运行时无法更改服务名称相关的知识,希望对你有一定的参考价值。

我正在尝试启动我的服务,但是我收到以下错误:

服务无法启动。 System.InvalidOperationException:无法在服务运行时更改服务名称。 at System.ServiceProcess.ServiceBase.set_ServiceName(String value)位于 workgroup.net projects Bar Bar Bar.Designer.vb中的Bar.Bar.InitializeComponent():Bar.Bar.OnStart(String [] args第47行)在 workgroup.net projects Bar Bar Bar.vb:第22行在System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(对象状态)

我根本不想改变服务名称!什么会导致错误?

Protected Overrides Sub OnStart(ByVal args() As String)
    InitializeComponent()
    writeToLog("in onstart")
    folderToWatch = New FileSystemWatcher
    folderToWatch.Path = sDocDir
    With folderToWatch
        .NotifyFilter = .NotifyFilter Or NotifyFilters.FileName
        .NotifyFilter = .NotifyFilter Or NotifyFilters.Attributes
    End With
    AddHandler folderToWatch.Created, AddressOf ProcessBarCode
    folderToWatch.EnableRaisingEvents = True
End Sub

InitializeComponent功能:

'Required by the Component Designer
Private components As System.ComponentModel.IContainer

' NOTE: The following procedure is required by the Component Designer
' It can be modified using the Component Designer.  
' Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
    'Bar'
    Me.ServiceName = "Bar"

End Sub
答案

InitializeComponent()方法调用未正确放置。使用Windows服务项目模板时很难出错,Service1.cs源文件中自动生成的代码如下所示:

    public Service1() {
        InitializeComponent();
    }

换句话说,服务在构造函数运行时获取其名称。哪个很早发生,Program.cs中自动生成的代码如下所示:

    static void Main() {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new Service1()                    // <=== here
        };
        ServiceBase.Run(ServicesToRun);
    }

换句话说,在程序启动之前,在它开始与OS交互并且已经提交到服务名称之前。 OnStart()为时已晚,它是来自操作系统的回调。

因此,请验证构造函数和Main()入口点是否仍然良好。并从OnStart()中删除该调用。

另一答案

我最终在设计师中评论了这一行并解决了这个问题:

<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
    'Me.ServiceName = "Bar"
End Sub

以上是关于服务运行时无法更改服务名称的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Windows 服务的名称?

更改 Python 脚本的 DNS 服务器

无法卸载 Windows 服务:“...无法删除,因为它与日志名称相同。”

更改选项卡时避免/防止片段刷新

运行时使用的 Kettle Change 连接

更改文件权限会导致 IdentityNotMappedException(在 Web 服务器上运行代码时)