在安装期间运行MSI

时间:2010-09-03 17:04:19

标签: .net installer windows-installer

我正在寻找一个.net应用程序的安装程序,它需要运行一些其他的MSI。由于你一次只能运行一个MSI的限制(老实说,它是1995年吗?)和我希望提供运行哪些MSI的可配置性我不能只是在引导程序中推送MSI似乎是推荐的实践。我找到了similar question,但没有对响应感到高兴。

作为替代方案,是否有基于.net的安装程序框架,可用于自定义安装过程?我熟悉IzPackInstallJammerNSIS,但所有这些都使用非.NET语言,如果对于那些有点害怕其他技术的.net商店的话。

2 个答案:

答案 0 :(得分:3)

如果你可以使用他们的用户界面或只做WiX风格的用户界面,WiX可以解决这个问题。

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

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

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

细节中的魔鬼,但它起作用并且效果很好!

使用更多备注编辑2010年9月3日:

如果采用这种方法,可以考虑以下事项:

  • 什么是维护模式体验?您可能需要在系统某处缓存引导程序,以便在从ARP启动时可以打开它。
  • 升级和卸载怎么样?你是否允许升级一些MSI而不是其他MSI?
  • 如何检测升级与维护模式?几乎你必须扫描所有MSI,如果这些MSI中的任何一个(想想“功能”)已经过时,那么你就是在升级而不是维护。
  • 考虑部分功能添加...您是否支持只安装部分MSI?在这种情况下,可以进行一些升级并重新安装其他方案。
  • 您可能最终会为整个套件引入套件版本的概念。不要自欺欺人......这只是一个人/营销版本...只有MSI版本的问题,只有那些版本应该用于确定安装/维修/升级等。

基本上,在创作安装时(无论是单个MSI还是复合套件安装),请确保在整个软件生命周期中列出所有用例。以短视方式编写安装程序非常容易,然后在v2出现时发现自己被涂成了一个令人不快的角落。

祝你好运;)

答案 1 :(得分:0)

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

即使您坚持按照自己的方式制作MSI,我仍然会推荐NSIS用于.exe。这些脚本通常很小。