【问题标题】:C# Windows Service - Default Arguments on InstallC# Windows 服务 - 安装时的默认参数
【发布时间】:2009-07-14 10:24:30
【问题描述】:

我的应用程序(它是一个 Windows 服务)需要一个命令行参数,即配置文件的位置。

我希望服务能够自动启动。填写“启动参数”值仅适用于手动启动,服务停止后该值不保留。

我尝试在注册表中手动编辑“可执行文件路径”,但 .net 服务没有将其重新识别为命令行(将路径的第二部分作为参数)

有没有办法在安装时设置默认参数(使用 InstallUtil 或任何其他方式)?

谢谢

【问题讨论】:

    标签: .net


    【解决方案1】:

    您可以通过将命令行参数附加到以下位置的 ImagePath 参数值来将命令行参数添加到您的服务:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<your service>\
    

    使用Environment.GetCommandLineArgs Method,您可以在服务启动时阅读它们。

    【讨论】:

    • 所以我只使用 Environment.GetCommandLineArgs 而不是 OnStart 中的 args 参数?谢谢瑞克。明天我会试一试。
    【解决方案2】:

    我们使用应用程序配置文件来执行此操作,服务可以从那里读取它的初始化选项。

    【讨论】:

    • 就是这样 - 这是我试图传入的配置文件的位置。我不能使用默认配置文件(例如 config.xml),因为工作目录不是我的应用程序在哪里,因为它是一个 Windows 服务。配置文件需要与应用程序位于同一位置。
    • 如果您使用 myapp.exe.config(通过将 app.config 添加到您的项目中)并通过 ConfigurationManager.AppSettings["StateServerPort"] 读取设置,则该文件将从应用程序目录而不是工作目录中读取。
    • 如果您只想找到运行的位置而不是工作目录,也可以使用反射找到可执行文件的位置。
    【解决方案3】:

    您知道吗,如果您使用服务安装程序,您可以根据安装程序中的内容来设置注册表设置,而无需让用户执行任何后期操作或运行某些批处理文件。

    Imports System.ComponentModel
    Imports System.Configuration.Install
    
    Public Class ProjectInstaller
    
        Public Sub New()
            MyBase.New()
    
            'This call is required by the Component Designer.
            InitializeComponent()
    
            'Add initialization code after the call to InitializeComponent
    
        End Sub
    
        Private Sub ServiceInstaller1_AfterInstall(ByVal sender As System.Object, ByVal e As System.Configuration.Install.InstallEventArgs) Handles ServiceInstaller1.AfterInstall
    'Put some code regarding your Installation specific options.
        End Sub
    End Class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2019-04-24
      • 2011-12-10
      • 1970-01-01
      相关资源
      最近更新 更多