如何创建一个用C#编写的独立,自包含的安装程序?

时间:2009-11-04 08:13:41

标签: c# installation

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

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

更新

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

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

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

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

7 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

嗯,这就是InnoSetup等安装程序系统多年来一直处于活跃开发状态的原因 - 编写安装程序并非易事。您说您希望完全控制该过程,您可以通过从头开始编写安装程序来实现该过程。

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

我认为从头开始创建安装程序所花费的时间将更好地投入到检查各种现有系统,评估哪一个为所需的所有设置任务提供最佳支持然后定制它,以便设置流程符合您的需求。

答案 3 :(得分:1)

对于我们每周用新数据更新的应用程序,我们做到了这一点。

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

然而,我们的需求相当简单,但它允许我们删除对Installshield的依赖,这种依赖会在内部引起一些支持问题。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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