2010-09-03 133 views
1

我正在寻找一个.net应用程序的安装程序,它需要运行一些其他MSI。由于限制你一次只能运行一个MSI(说实话,它是1995年吗?),而且我希望提供可配置的MSI来运行,我不能只将MSI推入引导程序中,因为这似乎是推荐的实践。我发现一个similar question,但没有回应的快乐。在安装过程中运行MSI

作为替代方案是否存在基于.net的安装程序框架,可用于定制安装过程?我熟悉IzPack,InstallJammerNSIS,但所有这些都使用非.NET语言,并且这对于有点害怕其他技术的.net商店也是如此。

回答

3

如果您使用他们的用户界面或简单地使用WiX风格的用户界面,则WiX解决了这个问题。

如果您想要更丰富的UI体验,您需要编写自定义引导程序。过去我通过编写一个客户引导程序解决了这个问题,该引导程序为用户提供了一个统一的用户界面,并使安装看起来像一个单独的包,实际上安装是按顺序运行的MSI文件的集合。

下面是我所做的一般要点:

  • 引导程序是.NET托管代码。优点:更容易编写。缺点:某些系统没有.NET,我必须为我的托管引导程序安装一个小型非托管引导程序,这个引导程序先部署.NET,然后启动托管引导程序。
  • 发现MSI文件(app.config工程...我的应用程序更复杂)。
  • 的受管MSI API来读取每个MSI文件功能列表
  • 内置一个单一的“特征选择”向导创建顶级功能为每个MSI文件,然后填充子功能,从每个读取.NET的WinForms页MSI文件。
  • 根据功能选择和其他选项(卸载,修复,升级等)创建MSI命令行。
  • 为“套件”安装程序创建了卸载注册表项,并隐藏了MSI特定的卸载密钥,以便添加/删除程序/程序&功能中只有一个条目。

魔鬼的细节,但它的工作,它运作良好!

编辑2010/9/3更多的音符:

这里有一些事情,如果你采取这种方法来考虑:

  • 什么是维护模式的经验吗?您可能需要将系统引导程序缓存到系统中,以便在从ARP启动时打开它。
  • 如何升级和卸载?你允许升级一些微星而不是其他微星吗?
  • 如何检测升级与维护模式?几乎你必须扫描所有的MSI,如果这些MSI(认为“功能”)中的任何一个已过期,那么你将作为升级运行,而不是维护。
  • 考虑部分功能增加...您是否支持只安装部分MSI?在这种情况下,可以升级一些并重新安装其他场景。
  • 您可能最终会为整体套件介绍套件版本的概念。不要欺骗自己......这只是一个人/市场版本......只有MSI的问题的版本,只有这些版本才能用于确定安装/修复/升级等。

基本上,在编写安装(无论是单个MSI还是组合套件安装)时,请确保为整个软件生命周期布置了所有用例。以短视的方式编写安装程序非常容易,然后在v2发布时发现自己被绘成不愉快的角落。

祝你好运;)

+0

这似乎是一个很好的方式去了解它。有关创建套件注册表项的任何提示? – stimms 2010-09-03 17:19:23

+0

添加/删除程序主要由HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall中的条目构建。看看那里的一些条目,以了解它的结构。您可以通过Google获取有关如何隐藏其他应用的信息......有几种技术。 我已经更新了我的答案,以包含一些其他注意事项,如果采取此方法,您将需要考虑。严重敲门的学校。 – 2010-09-03 19:31:11

+0

您的回复确实非常非常有帮助。感谢您抽出宝贵的时间。 – stimms 2010-09-03 20:51:53

0

我使用WiX创建MSI,然后使用非常小的NSIS脚本将它们打包到.exe中。我已经与微软的项目交流过了,他们自己使用了很多。如果您发现XML令人生畏,那么有些工具可以帮助您使用它。

即使您坚持让MSI成为您的工作方式,我仍会推荐NSIS作为.exe。脚本通常很小。