【问题标题】:VS Setup Project - Installing Assemblies to GAC and starting a service that uses them all in one installationVS 安装项目 - 将程序集安装到 GAC 并启动一项在一次安装中使用它们的服务
【发布时间】:2011-04-12 12:49:09
【问题描述】:

我已阅读有关 MSI 安装的所有 stackoverflow 文章,但我找不到解决问题的方法:

我有一个包含 5 个项目的 VS2010 解决方案,所有项目都针对 .NET 2.0:

  • DLL A,无项目引用
  • DLL B,引用 DLL
  • 一个 Windows 窗体应用程序,引用 DLL B
  • Windows 服务,引用 DLL B
  • 设置项目

DLL A 和 DLL B 设置为在安装时安装到 GAC。我想在安装完成后启动服务,但根据我所阅读的内容,直到最后一步才注册程序集。我已经通过尝试在我的 ServiceInstaller 类的 AfterInstall 事件上启动服务来证明这一点,我收到以下错误:

错误 1001。无法加载文件或 程序集“DLL_B”,版本 1.0.0.1, 文化=中性, PublicKeyToken=5e297270603814f4' 或 它的依赖项之一。系统 找不到指定的文件。

当然,一旦安装完成,我可以手动启动服务,它运行良好。此外,在 Windows XP 中,我通常可以在应用程序启动时启动服务(我有一个复选框,其中包含启动应用程序作为安装程序的最后一步)。但在 Windows 7 中,此时权限不再提升,启动服务会引发错误。

如何在不强制重启的情况下实现服务的安装和启动?引用我的客户的话:“现在是 2011 年,这不应该是必要的。”我完全同意。

提前谢谢。

【问题讨论】:

    标签: dll windows-services installation windows-installer setup-project


    【解决方案1】:

    这是 GAC 的一个众所周知的问题。一种选择可能是使用两个单独的安装程序并以菊花链方式连接它们。这是我们选择解决在 Vista 及更高版本上部署 Microsoft VC 运行时问题的方法。如果您使用合并模块,任何依赖它们的服务都不会启动。因此,实际上您将 GAC 指定的组件放入预安装程序中,在您运行第二次安装之前完成并提交其事务,该安装将安装并启动依赖于它们的服务。丑陋,我知道,但总比重启好。

    【讨论】:

      【解决方案2】:

      一种解决方案是使用在 InstallExecuteSequence 表中的 InstallFinalize 之后运行的自定义操作。此自定义操作应使用 msidbCustomActionTypeAsync and msidbCustomActionTypeContinue 标志,以便在安装完成后在单独的进程中运行。

      这无法通过 Visual Studio 安装项目完成,但有很多替代方案:Orca、WiX、商业安装创作工具等。

      【讨论】:

      • 在 InstallFinalize 之后安排的任何 CA 都不会拥有提升的权限。如果 UAC 关闭,这可能会起作用,但这不是一个好的做法,IMO。
      • 这是真的。但可以通过提升安装程序 UI(例如使用引导程序)或带有请求提升的应用程序清单的 EXE 自定义操作来轻松避免。
      • 我将 Cosmin 的答案标记为正确答案,因为它最接近,仅仅是因为他说“这不能通过 VS 设置项目完成,但有很多替代方案。”我选择使用 InnoSetup。我发现它很容易,并且完美地满足了我的需求。安装程序正在快速尖叫,并完全按照我的需要做。
      【解决方案3】:

      我解决这个问题的方法略有不同:我不仅在 GAC 中安装了我的程序集,而且还在应用程序文件夹中安装了我的程序集。我的 GAC 绑定程序集已作为依赖项被发现,因此我将它们放入 GAC(并且那些确实只有在执行了所有自定义步骤后才最终存在)。我还将相同的程序集作为主要输出添加到应用程序文件夹,我的带有自定义操作的 InstallHelper DLL 也驻留在该文件夹中。这种方式在安装过程中使用来自应用程序文件夹的本地副本。

      【讨论】:

        猜你喜欢
        • 2012-05-19
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多