【问题标题】:How to create a standalone, self-contained setup program written in C#?如何创建一个用 C# 编写的独立、自包含的安装程序?
【发布时间】:2009-11-04 08:13:41
【问题描述】:

我有一个具有复杂设置要求的应用程序。我非常熟悉一些用于创建安装程序的工具,例如 Wix、Visual Studio 安装项目、Inno-setup 和 3rd 方工具。然而,对于这个特定的应用程序,我已经确定我需要用 C# 从头开始​​编写安装程序,而不是使用任何这些工具。 Joel 表达的一些推理在这里适用,除了我想在 C# 而不是 MFC 中执行此操作。

无论如何,我的问题是:我将如何创建一个可以包含一组在运行时提取的文件的 .NET 可执行文件?在这种情况下,exe 是安装程序,文件是它需要安装的程序文件。另外,我如何使程序完全独立地可执行,即即使我使用一些外部程序集(我自己的以及第 3 方)我希望它们被打包到一个单独的 EXE 中(在 C/C++ 原生世界中,这是通过静态链接完成)。

更新

这是我到目前为止所采用的方法,除非有人提出更好的建议,否则我会坚持下去:

  • 以 XML 格式创建了一个清单文件,其中包含所有文件的列表以及包含我的安装程序正在安装的应用程序的文件夹结构。我将此文件添加到安装程序的 VS 项目中。
  • 用 C# (zipfiles.exe) 编写了一个工具,该工具采用清单 XML 并创建一个包含所有文件的 zip 文件。这个工具使用了很棒的 DotNetZip 库来创建 zip。
  • 在我的安装程序项目中添加了 Pre-Build 操作,该操作使用清单 XML 启动 zipfiles 工具,并在项目文件夹中输出 zip 文件 (Files.zip)。
  • 在我的安装程序项目中添加了 Files.zip 作为嵌入式资源。
  • 我的安装程序在运行时提取嵌入式 zip 并将其解压缩到应用程序的目标安装文件夹(再次使用 DotNetZip)
  • 在我的安装程序项目中添加了一个 Post-Build 操作,它使用 ILMerge 工具将它使用的所有外部程序集捆绑到 exe 中。

我现在有一个用于我的安装程序的 VS 项目,它构建了一个独立的 exe,其中嵌入了它需要安装的所有文件。当正在安装的应用程序的文件列表发生变化时,我只需更新清单 XML 并重新构建。

现在我可以专注于其余的设置逻辑!

【问题讨论】:

  • 在 MFC 中写“任何东西”简直太疯狂了!
  • 等等,乔尔这样做并不排除它疯了的可能性。他在曼哈顿创办了一家软件公司,该公司也不是投资银行。太疯狂了!
  • 那是不同的时代......我正在尝试做同样的事情,除了使用更现代的语言 C#
  • 注意我只是重写了我的问题,所以上面的“疯狂”言论不再有意义。很抱歉,我需要这样做以使问题更加集中。

标签: c# installation


【解决方案1】:

只需创建一个仅包含一个 custom install action 的标准 Visual Studio 安装项目。

这实际上是一个标准的 .NET dll 程序集,您可以在其中运行安装和卸载应用程序所需的任何代码。

它的存在正是您提到的原因,即当您的应用程序。需要比标准安装程序提供的更复杂的安装和卸载步骤。

【讨论】:

  • 这仅允许您在 .NET 中编写 MSI 自定义操作。它不能让您控制整个设置过程(UI 对话框、工作流逻辑等)。
  • 实际上它可以让您完全控制设置过程。即创建您自己的设置 UI 对话框、设置 SQL 数据库、写入注册表、安装/启动服务。我自己用它来进行复杂的设置。整个设置只是一个自定义操作。实际上,您是从头开始做的,但在 Windows 安装指南范围内,即您可以免费获得添加/删除程序等。
  • 嗯.. 不知道您可以在自定义操作中抛出 UI 对话框。但它仍然是一个自定义操作,由 MSI 引擎在设置中的特定时间调用。您无法控制之前或之后发生的事情。
  • 没错,但是因为安装程序只包含自定义操作,所以无论如何都无法控制。您的自定义操作是普通的 .NET 代码。例如,您可以引用 System.Windows.Forms 并显示您需要的任何内容。
【解决方案2】:

您可以使用 Inno-Setup 作为安装程序的主要容器。在 Inno-Setup 中,您可以运行并等待您自己的应用程序,这些应用程序安装或配置应用程序的特定部分。

【讨论】:

  • 这可以作为 iexpress 的更灵活的替代方案......使用 inno setup 作为解包和启动安装程序的包装。我会进一步调查,谢谢
【解决方案3】:

嗯,像 InnoSetup 这样的安装程序系统多年来一直在积极开发中是有原因的 - 编写安装程序并不是一件容易的事。你说你想完全控制这个过程,你说你可以通过从头开始编写安装程序来实现。

这当然是正确的,但这并不是一个完全自己编写的好理由 - 您可以通过从头开始编写来实现这一点,但是例如,使用 Inno Setup 的脚本功能来创建您自己的 UI 和设置流程,同时仍然依赖 Inno Setup 的经过充分测试的功能。

我认为,您必须花时间从头开始创建安装程序,最好花时间检查各种现有系统,评估它们,以确定哪个系统可以为所需的所有设置任务提供最佳支持,然后进行自定义它,以便设置流程满足您的需求。

【讨论】:

  • 我不想用几乎没人知道的脚本语言编写我所有的设置逻辑,即使我学会了,我也会忘记。我的目标是在 C# 中做到这一点,任何人都可以学习和维护,而且我不会忘记。
  • 另外,通过在 C# 中编写设置逻辑,您可以获得更好的工具 (VS) 更好的可测试性。
【解决方案4】:

我们就是为每周更新新数据的应用程序这样做的。

我们创建了两个应用程序。第一个用于包装安装。这包括收集要分发的文件,然后将它们压缩到一个 zip 存档中。我们使用ChilkatZip 创建了一个存档,该存档将自行解压缩,然后执行处理客户端计算机上的安装过程的第二个应用程序。

然而,我们的需求相当简单,但它允许我们消除对 Installshield 的依赖,该依赖会导致内部出现一些支持问题。

【讨论】:

    【解决方案5】:

    安装可能不会太难(假设已经安装了 .NET 框架),但您还需要考虑在安装失败和卸载期间回滚。这就是 MSI 安装如此复杂的原因。你需要自己处理这个......

    【讨论】:

    • 是的,我明白这一点。编写一个简单的提交/回滚机制并不难。我也在 .NET 2.0 中执行此操作,这将是运行设置的最低先决条件。我的第一个问题是弄清楚如何将所有内容(设置程序文件、应用程序文件和资源)捆绑到一个 exe 中,并正确处理在添加/删除程序中注册以指向该 exe。
    【解决方案6】:

    WIX 是制作 MSI 的标准。学习 IMO 有点复杂和令人沮丧,但这是值得的。计划花一天时间进行基本的安装程序。这是 Microsoft 和许多其他公司使用的工具。

    【讨论】:

      【解决方案7】:

      使用SharpSetup怎么样?它允许您混合 C# 代码(包括 WinForms 中的安装程序 GUI)、WiX(用于创建文件、注册表项、快捷方式等基本设置)和 C++ 代码(以防 .NET Framework 尚未安装)。构建过程将所有这些部分组装在一起,最终您将获得可在任何现代 Windows(W2K 及更高版本)上运行的独立单文件安装程序。

      免责声明:我是 SharpSetup 的作者。

      【讨论】:

        猜你喜欢
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 2011-09-19
        相关资源
        最近更新 更多