【问题标题】:How do I create a Setup program for a Windows Service without using InstallShield?如何在不使用 InstallShield 的情况下为 Windows 服务创建安装程序?
【发布时间】:2016-02-25 00:14:20
【问题描述】:

我正在寻找一种方法来为我正在开发的这个 Windows 服务创建和/或添加安装程序。要求是不能有 3rd-party 材料(InstallShield、InstallUtil.exe、WiX 等);它必须严格从 C# 中完成,并且我必须在安装服务之前将参数传递给服务。

我基本上只是在编写一个服务来监视用户指定的文件夹及其子目录,以进行特定的更改。我已经构建了服务及其安装程序,但我需要能够将服务分发到客户端的计算机,而我的服务唯一需要的就是安装期间的文件夹路径。

我在 SO 和 Goog 上进行了全面搜索,但我发现很少能帮助我建立自己的设置,所以如果有人可以在这里提供教程或指向当前存在的链接,请帮助我关于如何在没有任何第三方东西的情况下构建自己的安装程序的完整教程,这太棒了。

这是我的通用代码拆分成各自的文件:

程序.cs:

using System.ServiceProcess;
namespace MyService
{
    static class Program
    {
        static void Main( string[] args )
        {
            ServiceBase.Run( new MyService( args ) );
        }
    }
}

MyService.cs:

using System;
using System.IO;
using System.ServiceProcess;
namespace MyService
{
    public partial class MyService : ServiceBase
    {
        public MyService( string[] args )
        {
            InitializeComponent();
            this.ServiceName = "MyService";
            this.AutoLog = this.CanHandlePowerEvent = 
            this.CanHandleSessionChangedEvent = this.CanPauseAndContinue = false;
            this.CanStop = this.CanShutdown = true;
        }
        protected override void OnStart( string[] args )
        {
            FileSystemWatcher watcher = new FileSystemWatcher(/*'watcher' arguments*/)
            { IncludeSubdirectories = true /*, Set NotifyFilters*/};
            watcher.Changed += ( sender, e ) => { /*Handle the event*/; };
            watcher.EnableRaisingEvents = true;
            base.OnStart( args );
        }
        protected override void OnStop()
        {
            watcher.Dispose();
            base.OnStop();
        }
        protected override void OnShutdown()
        {
            watcher.Dispose();
            base.OnShutdown();
        }
    }
}

ProjectInstaller.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
namespace MyService
{
    [RunInstaller( true )]
    public partial class ProjectInstaller : Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();
            EventLogInstaller eventLogInstaller =
                this.Installers.Cast<Installer>().First
                    ( installer => installer is EventLogInstaller ) as EventLogInstaller;
            if( eventLogInstaller != null )
                eventLogInstaller.Log = "MyService";
            this.Installers.Add( new ServiceProcessInstaller() 
            { Username = null, Password = null } );
            this.Installers.Add( new ServiceInstaller() 
            { StartType = ServiceStartMode.Automatic } );
        }

        protected override void OnAfterInstall( IDictionary savedState )
        {
            base.OnAfterInstall( savedState );
            using( ServiceController controller = new ServiceController
                ( this.serviceInstaller1.ServiceName, Environment.MachineName ) )
            { controller.Start(); }
        }
    }
}

我希望客户端能够只双击设置文件,然后打开一个窗口,询问他们希望服务监视的顶级目录路径。显然,我需要为它构建一个带有目录浏览器功能的 GUI,我可以很容易地做到这一点,但我不知道如何将它们整合在一起。那么,有人可以告诉我如何将这三个文件或构建它们的可执行文件添加到安装程序中,以便我可以获取路径,将其传递给服务(我将从命令行执行,但我也已经知道如何做这部分),并在我客户的机器上启动并运行它?

【问题讨论】:

  • 为什么不使用像 Wix 或 InstallShield 这样的技术?这就是它们存在的原因,以帮助打包并为您提供具有专业外观的安装程序。
  • @JohnKoerner 我不想使用这样的东西有几个原因。 1:我想知道它在幕后是如何运作的。也许有一天我会创建自己的一个或包含类似的功能。 2:我不需要那种强大的东西;我只是为一个非常特殊的东西创建了一个 rinkydink 小服务。 3:这是我必须依赖的更多技术,a)可能存在安全漏洞,b)最终可能会过时。了解自己如何去做比依赖别人去做更有意义。那么为什么不现在就学习呢?
  • Wix 是 open source (MS-RL),因此您可以使用该代码来了解安装程序的工作原理。 Wix 构建了一个 MSI,MSI 中有一些基本操作可以执行安装服务和在添加/删除程序中注册您的产品等操作。另一个优点是您可以引导安装程序以确保在开始安装之前安装正确版本的 .net。如果您自己滚动,则需要自己处理所有这些。
  • 谢谢,@JohnKoerner。我会看看它,看看它是否可以帮助我。同时,如果您遇到与我在帖子中描述的内容类似的情况,请在此处回复。

标签: .net c#-4.0 visual-studio-2012 service deployment


【解决方案1】:

我已经构建了一些我们提供给最终用户的 Windows 服务。以下是架构

  1. 我构建 Windows 服务
  2. 我创建了几个 .bat 文件来完成任务
  1. 使用 ServiceController sc.exe 安装服务
  2. 使用同一个服务控制器启动/停止/卸载

用户只需解压缩交付物并右键单击蝙蝠并说“以管理员身份运行”。

您可以将安装、启动和单个 bat 文件中的几行链接起来。

要查找/了解有关 sc.exe 的更多信息,请参阅here 样本 : sc create newservice binpath= c:\nt\system32\newserv.exe type= own start= auto depend= "+tdi netbios"

【讨论】:

  • 感谢您的回复,但它并没有解决我在帖子正文中作为大纲的需要。我正在寻找“此处的教程,或指向当前存在的完整教程的链接,该教程介绍了如何在没有任何第三方内容的情况下构建自己的安装程序。”它必须严格使用 C# 完成并且是单个文件(安装程序),这意味着没有 BAT、XML 等。我想让它对我的客户尽可能简单:他们只需双击安装程序(安装程序) ,他们就完成了。我可以创建安装程序的内容,但我需要一个启动它的模板。
  • @Meloviz 嘿,发送您的应用程序,OP 一定会为您集成代码。 (捂脸)他告诉你你需要什么。命令行安装服务。就Process.Start吧。检查退出代码。真的很容易!并将自定义命令行添加到您的工具“--install”中,然后运行安装命令行过程并通知用户成功或失败。确保您处于管理员模式(提升)。
猜你喜欢
  • 1970-01-01
  • 2015-03-21
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
相关资源
最近更新 更多