【发布时间】: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