代码之家  ›  专栏  ›  技术社区  ›  Jørn Schou-Rode dscher

如何在不扩展安装程序的情况下安装Windows服务?

  •  1
  • Jørn Schou-Rode dscher  · 技术社区  · 15 年前

    我正在建造一个可重复使用的 framework for building scheduling services 使用.NET框架。我的代码作为库分发,然后由用户在控制台应用程序中引用。在应用程序的主要入口点,要求用户将控制权转移到库中的静态方法,如果在非交互模式下运行,该方法将开始作业调度,或者读取命令参数并执行维护任务,如安装。

    要将应用程序安装为Windows服务,请使用 System.Configuration.Install 命名空间,则用户必须添加 Installer 通知框架如何安装服务。我真的希望在库中一次性地完成这项工作,但不幸的是,安装程序类

    我现在看到的解决方案包括在库中定义安装程序类,并要求用户在公共类中继承它,而不添加任何其他代码。虽然这是可行的,但它需要用户编写恼人的锅炉铭牌代码。

    除了扩展,还有什么替代方案 安装工 ? 我可以更直接地访问托管安装框架吗?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Filburt kukabuka    15 年前

    我用 SC.exe

    这样做只会将此存根保留在服务安装程序类中:

    [RunInstaller(true)]
    public partial class SoapSenderInstaller : Installer
    {
        public SoapSenderInstaller()
        {
            InitializeComponent();
        }
    }
    

    调用SC.exe的方法很简单,如下所示:

    sc create MyService binpath= "C:\Path\to\my\MyService.exe" DisplayName= "My Service Display Name" depend= MSMQ start= auto
    

    binpath=[BLANK]"MyService.exe"
    

    编辑

    当然,这个解决方案不符合这样的要求,即用户不必创建任何代码,使其二进制文件成为windows服务,因为如果他只是引用您的库,他仍然需要从ServiceBase继承并实现OnStart()和OnStop()。

        2
  •  0
  •   Jane Jane    15 年前

    我知道,如果您使用installer.codeffects.com编译安装程序,您可以向安装程序添加一些自定义字段,并在安装过程中要求用户输入。可能是,通过要求最终用户将名称空间或类型名称作为字符串输入,您可以在运行时动态加载或调用所需的内容?

    在你的情况下,我想不出还有什么别的办法。

    推荐文章