2009-07-20 65 views
1

我正在使用VS 2008安装和部署项目来部署混合托管/非托管应用程序。我在使用内建注册属性(“vsdraCOM”枚举“Register”属性的值)注册混合模式DLL时遇到了问题。作为解决方法,我添加了一个.NET自定义安装程序集(带有一个类派生自System.Configuration.Install.Installer。)我确定该类正在运行,并且一些操作已成功安装并通过该程序集中的代码进行卸载,包括执行多个程序集的Dll(Un)RegisterServer入口点。在运行.NET自定义操作之前强制安装GAC?

但是,一个DLL没有成功注册。它是唯一依赖于想要安装到GAC的第三方可再发行组件程序集的DLL。我已经将这些程序集安装到了GAC中,这要归功于VS 2008的安装和部署项目中的内置支持,而且我知道这是可行的。我已经确认,发生的情况是自定义操作在安装程序执行GAC安装之前正在执行。

噢。所以我的问题是,有没有办法强制安装程序在执行自定义操作之前执行GAC安装?有没有办法使用自定义操作的“条件”属性来做到这一点?如果不是,我最好的选择是什么?从DLL中捕获注册表项并将它们添加到安装程序的注册表设置中(不要这样做,因为将来有人可能会向该类添加新的COM服务器)?使用.NET代码手动将程序集安装到GAC中(不知道如何执行此操作)?

感谢,

戴夫

回答

2

你可以在Visual Studio中创建的安装项目是非常有限的。它只允许自定义动作安排在4点。但是,MSI允许自定义操作在流程中的任意位置进行安排,并对其可执行的操作进行一些限制。

我的第一个解决方案是停止使用Visual Studio 2008作为安装开发工具。 Visual Studio团队试图抽象出创建安装的所有复杂性。然而,在这个过程中,他们也夺走了微星的全部灵活性。 Wix,InstallShield或Wise对于除简单安装以外的任何其他产品都是更好的产品。我开始使用Visual Studio进行安装,结果工作太多。总有一个解决方案需要实施,其副作用需要处理。

如果您无法切换技术,那么您需要了解如何手动修改生成的MSI文件。在你的情况下,你需要修改InstallExecuteSequence表,http://msdn.microsoft.com/en-us/library/aa369500(VS.85).aspx。您可以通过Orca,http://msdn.microsoft.com/en-us/library/aa370557(VS.85).aspx或通过MSI API http://msdn.microsoft.com/en-us/library/aa372860(VS.85).aspx手动执行此操作。确保下载Orca并针对您的安装运行验证脚本。这些脚本指出了很多问题,在部署到客户机器时修复会为您节省无数的时间。

+0

谢谢,我们确实使用installshield,但它会在生成计算机再次运行几个星期之前,我需要尽快安装。 MSI API解决方案听起来很有前途。仅供参考,我发现System.EnterpriseServices.Internal.Publish.GACInstall()会在GAC中安装一个任意程序集,但这并不理想,原因很多(“内部”,很少有错误检查,对于回滚/卸载语义。) – 2009-07-20 17:33:03

相关问题