1

我读过关于MSI安装的每一个计算器文章一个服务,但我无法找到解决我的问题:VS安装项目 - 安装组件到GAC并开始使用它们都在同一个安装

我有一个有5个项目,VS2010解决方案的所有目标.NET 2.0:

  • DLL A,没有项目引用
  • DLL B,引用DLL
  • Windows窗体应用程序,引用的DLL乙
  • Windows服务,引用的DLL乙
  • 安装项目

DLL A和DLL B被设置为被安装到GAC在安装时。我想在安装完成后启动服务,但根据我读过的内容,程序集只有在最后一步才会注册。我已经试图开始在我的ServiceInstaller类的AfterInstall事件服务证明了这一点,我得到以下错误:

Error 1001. Could not load file or assembly 'DLL_B', version 1.0.0.1, Culture=neutral, PublicKeyToken=5e297270603814f4' or one of its dependencies. The system could not find the file specified.

但当然,一旦安装完成后,我可以手动启动该服务,它运行精细。另外,在Windows XP中,我通常可以在应用程序启动时启动服务(我有一个Launch Application复选框作为安装程序的最后一步)。但是在Windows 7中,当时不再提升权限,并且启动服务会引发错误。

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

提前致谢。

回答

1

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

这不能与一个Visual Studio安装项目来完成,但也有很多的替代品:Orca,维克斯,商业设置创作工具等

+0

在InstallFinalize之后计划的任何CA都不具有提升的权限。如果UAC关闭,这可能会起作用,但这不是一个好习惯,IMO。 – 2011-04-14 12:06:32

+1

这是真的。但是可以通过提升安装程序UI(例如使用引导程序)或使用请求提升的应用程序清单的EXE自定义操作轻松避免。 – 2011-04-14 12:12:14

+0

我标记了Cosmin的答案是正确的,因为它是最接近的,只是因为他说的这部分“这不能用VS设置项目来完成,但有很多选择。”我选择使用InnoSetup。我发现它非常简单,而且对我的需求来说是完美无缺的。安装程序尖叫得很快,完全符合我需要的。 – 2011-04-14 14:44:48

2

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

1

我的解决方案稍有不同:我不仅在GAC中安装了我的程序集,而且还在应用程序文件夹中安装了程序集。我的GAC绑定程序集已经作为依赖关系被发现,所以我将这些程序集放入GAC中(并且只有在执行完所有自定义步骤后,那些程序才会在那里结束)。我还将相同的程序集作为主输出添加到应用程序文件夹中,其中带有自定义操作的InstallHelper DLL也驻留在此处。这种方式在安装期间使用来自应用程序文件夹的本地副本。

相关问题