Dll VS Setup Project-将程序集安装到GAC并启动一个在一次安装中使用所有程序集的服务

Dll VS Setup Project-将程序集安装到GAC并启动一个在一次安装中使用所有程序集的服务,dll,windows-services,installation,windows-installer,setup-project,Dll,Windows Services,Installation,Windows Installer,Setup Project,我已经阅读了有关MSI安装的每一篇stackoverflow文章,但我找不到解决问题的方法: 我有一个包含5个项目的VS2010解决方案,所有项目都以.NET 2.0为目标: DLL A,无项目引用 DLL B,引用DLL Windows窗体应用程序,引用DLL B Windows服务,引用DLL B 设置项目 DLL A和DLL B设置为在安装时安装到GAC。我想在安装完成后启动服务,但根据我所读到的,程序集直到最后一步才注册。我已经通过尝试在ServiceInstaller类的After

我已经阅读了有关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中,我通常可以在应用程序启动时启动服务(我有一个复选框,其中“启动应用程序”是安装程序的最后一步)。但在Windows7中,此时不再提升权限,启动服务会抛出错误

如何在不强制重新启动的情况下安装和启动服务?引用我的客户的话:“现在是2011年,不需要了。”我衷心同意


提前感谢。

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


这不能用Visual Studio安装项目来完成,但有很多替代方法:、WiX、商业安装编写工具等。

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


Visual Studio安装项目无法做到这一点,但有很多替代方案:、WiX、商业安装创作工具等。

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

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

我处理这个问题的方式略有不同:我不仅在GAC中安装了我的程序集,而且还将其安装到了应用程序文件夹中。我的GAC绑定程序集已经作为依赖项找到,所以我将它们放入GAC中(实际上,只有在执行所有自定义步骤之后,这些程序集才会在GAC中结束)。我还将与主输出相同的程序集添加到应用程序文件夹中,带有自定义操作的InstallHelper DLL也位于该文件夹中。在安装过程中,使用了“从应用程序文件夹本地复制”的方式。

我处理这个问题的方式略有不同:我不仅在GAC中安装了我的程序集,而且还将其安装到了应用程序文件夹中。我的GAC绑定程序集已经作为依赖项找到,所以我将它们放入GAC中(实际上,只有在执行所有自定义步骤之后,这些程序集才会在GAC中结束)。我还将与主输出相同的程序集添加到应用程序文件夹中,带有自定义操作的InstallHelper DLL也位于该文件夹中。这样,在安装过程中,将使用应用程序文件夹中的本地副本。

在InstallFinalize之后计划的任何CA都不会具有提升的权限。如果UAC关闭,这可能会起作用,但在国际海事组织,这不是一个好的做法。这是真的。但是,通过提升安装程序UI(例如使用引导程序)或带有请求提升的应用程序清单的EXE自定义操作,可以很容易地避免这种情况。我将Cosmin的答案标记为正确答案,因为它是最接近的,仅仅是因为他说的部分“这不能用VS安装项目来完成,但有很多替代方案。“我选择使用InnoSetup。我发现这很容易,而且对我的需求来说是完美的。安装程序运行速度很快,完全按照我的要求执行。在InstallFinalize之后计划的任何CA都不会有提升的权限。如果UAC关闭,这可能会起作用,但在国际海事组织,这不是一个好的做法。这是真的。但是,通过提升安装程序UI(例如使用引导程序)或带有请求提升的应用程序清单的EXE自定义操作,可以很容易地避免这种情况。我将Cosmin的答案标记为正确答案,因为它是最接近的,仅仅是因为他说的部分“这不能用VS安装项目来完成,但有很多替代方案。”我选择使用InnoSetup。我发现它非常简单,而且对我的需求来说完美无瑕。安装程序运行得很快,完全符合我的需要。