【问题标题】:Installing Multiple Versions Of A Windows Service On The Same PC在同一台 PC 上安装多个版本的 Windows 服务
【发布时间】:2010-12-01 11:13:26
【问题描述】:

我有一个 .NET 3.5 Windows 服务,它有几种不同的配置/风格,即。发布、测试、调试等等安装在同一台机器上。有谁知道最好的方法吗?

谢谢

【问题讨论】:

    标签: .net-3.5 msbuild windows-services installation


    【解决方案1】:

    也许this article 会有所帮助?

    问题

    查看ServiceInstaller时 使用反射器的类,你会看到它 对CreateService 进行 Win32 调用 ServiceInstaller.Install 方法。 CreateService 将返回 ERROR_DUPLICATE_SERVICE_NAME返回 调用方法时的代码 带有serviceNamedisplayName 匹配的参数 已经安装的服务。这是 是什么导致Win32Exception 成为 扔在上面的窗口和 最终导致第二次安装 失败。您可以查看完整的 关于 CreateService 的文档 函数here

    要解决这个问题,所有需要 要做的是动态设置 安装期间的服务名称和 服务启动到一个已知值和 确保值不同 对于您的每个服务实例 安装。

    解决方案

    所有需要做的就是制作 确保每个服务的名称 安装实例是唯一的。然后 你需要有副本 每个安装目录 您想要的服务实例。 最后,您需要能够设置 期间动态的服务名称 安装和启动。这将是 方便使用 app.config 文件。

    本文继续提供有关如何在同一台计算机上安装 .NET Windows 服务的多个实例的分步说明。

    当然,我不禁想为什么您需要在同一台机器上同时运行调试和发布版本。

    【讨论】:

    • 谢谢,有帮助。至于需要这个的原因......不是我的想法,坦率地说,我认为没有必要。根据我们的高级开发人员的说法,我们应该将其作为构建的一部分,尽管我不完全确定为什么!
    • @TabbyCool:这是一个非常奇怪的要求。测试构建的发布版本是一个好主意(只是为了确保编译器优化不会引入错误),但我认为没有理由需要同时运行它们。考虑到没有最终用户会在该配置中运行,我希望它只会使调试变得更加困难。如果您需要能够调试发布版本,更好的想法是为发布版本生成 PDB 符号,而不是尝试同时运行两者。无论如何,很高兴能提供帮助。
    • 我认为这是为了以防我们需要在与实时系统相同的服务器上运行 UAT 环境 - 由于服务器问题,我们最近不得不将实时数据库移动到与 UAT 相同的服务器上。不理想,但预算已被削减,而且我们并没有很多服务器闲置!
    【解决方案2】:

    只是想提请注意文章 Cody gray references 中的 cmets。看来作者和评论者一致认为使用sc.exe有一个更简单的方法如下

    sc \\myserver create NewService binpath= c:\nt\system32\NewServ.exe
    

    【讨论】:

    • sc create NewService binpath="pathtoservice.exe" 为我们工作。谢谢。