安装程序向导的结构

时间:2011-11-08 14:29:49

标签: c# architecture configuration installer

我正在为一个我正在研究的项目开发C#中的安装和配置应用程序,我想知道内部组织所有内容的最佳方法是什么。

要求:

  • 用于部署的单个可执行文件,不包含与其捆绑的其他文件。
  • 必须支持每个面板上的自定义配置步骤,这有助于最终生成的XML配置文件。
  • 根据安装程序流程中的某些选择,可以跳过某些步骤。
  • 必须支持基于我的某个库中的类反馈的信息的动态配置屏幕。

以下是我的原型的描述:

  • 带有一组Panel控件的大表单,每个控件代表向导的一个“屏幕”。每个都被恰当地命名。
  • 每个“屏幕”的类,派生自我定义的基本类型。当某些事件发生时,我会调用它的具体方法(例如EnterBackForward)。
  • 状态存储为Dictionary<string,object>,传递给每个屏幕。最后一个屏幕(实际的“正在安装...”屏幕)从中读取配置并将其转储到XML文件中。
  • 每个屏幕的代码负责处理“下一个”和“上一个”按钮,因此我可以根据当前屏幕中的设置控制它跳转到的位置。
  • 我的库中存储了许多模块,这些模块提供了有关需要采取的额外配置步骤的信息。我正在通过反射和自动化UI生成来实现这一点。
  • 资产存储在可执行文件的资源中。

我不想使用通用的安装程序包(例如InstallShield),因为逻辑完全是自定义的,并且调用了我的一个类库。我想知道的是 - 我是以一种非常迂回的方式设置出来的吗?向导式应用程序是否有更简单或更标准的方法?

4 个答案:

答案 0 :(得分:4)

以下是简短的回答:

商业工具非常适合您的需求,因为它支持自定义安装UI和动态XML文件。其他任何事情都需要大量的学习和努力。

长期解释:

自定义安装UI不是一件容易的事。 Windows Installer提供内置对话框和控件,因此它通常是最佳解决方案。您也可以尝试专有的安装引擎,但是您需要学习它。

您也尝试使用自定义代码和类控制所有内容,从而采取了错误的方法。大多数安装创作工具都为处理安装UI和XML文件提供直接支持。为什么尝试重新发明轮子?

所以你基本上需要找到最适合你的设置创作工具。以下是一般清单: http://en.wikipedia.org/wiki/List_of_installation_software

这些工具可以是基于MSI的,也可以是专有的。我个人更喜欢Windows Installer(MSI包)。

尝试使用自定义代码实现所有任务是不值得的。

答案 1 :(得分:1)

在Windows上安装软件的唯一正确方法(我假设是您的目标平台)正在使用Windows Installer。简化一点Windows Installer基于安装包(数据库文件)的概念,可以在系统中添加或删除事务方式。

如果您编写自己的安装逻辑,则无法参与软件安装的事务处理。如果您的卸载程序被删除,则用户无法卸载您的软件。此外,Windows Installer知道很多关于Windows可能不知道的怪癖。

Windows Installer提供了一些cryptic API用于创建包,但您也可以使用非常强大的开源WiX toolset或任何商业安装程序,如InstallShield

如果您决定采用Windows Installer方式,则应尝试尽可能避免自定义操作。自定义操作与自定义安装程序具有相同的“事务回滚”问题。您可以在DLL中创建自定义操作回滚/卸载的代码,如果该DLL丢失,则Windows Installer无法撤消您的自定义操作。

Windows Installer实际上非常强大。您没有提供有关您需要做的“自定义内容”的任何具体信息,但是Windows Installer可能已经有了一个表格吗?

答案 2 :(得分:0)

使用InstallShield或MSI安装程序。认真。除了能够支持各种自定义逻辑(包括您指定的代码)之外,通用安装程序向导还会执行您甚至不会考虑的事情,例如,在“程序和功能”中列出已安装的应用程序,以及执行修复安装/卸载。

根据您正在查看的自定义逻辑级别,我将寻找最新的InstallShield安装程序构建器; VS Install项目构建成一个非常简单的对话框。

编辑:很公平,以前一直在那个位置。

我仍然强烈建议使用您可用的任何通用安装程序工具,例如VS的安装项目,原因如上所述;安装包执行您在设计中甚至没有考虑的事情,并且您可以免费获得所有这些内容。

而不是将此逻辑用于在安装程序中自定义XML配置文件,如何将其放入可执行文件中,作为用户在安装后启动应用程序时将看到的“一次运行”配置向导?这对你的用户来说不应该太偏僻,如果实际的应用程序也是一个WinForms应用程序(即使它不是;你可以将配置器编译成一个不同的应用程序并让你的主应用程序启动)它应该工作得很好配置器,如果它没有XML文件)。

答案 3 :(得分:-1)

  

用于部署的单个可执行文件,不包含其他任何文件。

您可能会对此感兴趣:http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx