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

时间:2010-01-26 10:23:59

标签: .net windows-services installer

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

为了使用System.Configuration.Install命名空间将应用程序安装为Windows服务,用户必须将Installer的类后代添加到应用程序程序集,告诉框架如何安装服务。我真的更愿意在库中一劳永逸地执行此操作,但不幸的是,安装程序类在应用程序集中。

我现在正在研究的解决方案涉及在库中定义安装程序类,并要求用户在公共类中继承它,而不添加任何其他代码。虽然这有效,但它需要用户编写恼人的锅炉板代码。

扩展Installer有哪些替代方案?我可以更直接地访问托管安装框架吗?

2 个答案:

答案 0 :(得分:3)

我使用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

唯一的缺陷是sc.exe期望其命令行参数的方式:

binpath=[BLANK]"MyService.exe"

修改

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

答案 1 :(得分:0)

我知道您可以向安装程序添加一些自定义字段,如果使用Installer.CodeEffects.com进行编译,则需要用户在安装过程中输入。可能是,通过要求命名空间或类型名称作为最终用户的字符串输入,您可以在运行时加载或调用您需要的东西吗?

在你的情况下,我想不出任何其他事情。