繁体   English   中英

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

[英]How to create a standalone, self-contained setup program written in C#?

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

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

UPDATE

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

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

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

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

只需创建一个标准的Visual Studio安装项目,该项目只包含一个自定义安装操作

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

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

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

那么,像InnoSetup这样的安装程序系统多年来一直处于积极开发阶段的原因是有道理的 - 编写安装程序并不是一件容易的事。 您说您希望完全控制该过程,您可以通过从头开始编写安装程序来实现该过程。

这当然是真的,但它不是为写这一切自己一个很好的理由-你可以通过从头开始编写这一切实现这一目标,但是通过使用例如创新安装的脚本功能来创建自己的UI和设置虽然仍然依赖于Inno Setup经过充分测试的功能。

我认为从头开始创建安装程序所花费的时间将更好地用于检查各种现有系统,评估哪些系统为所需的所有设置任务提供最佳支持,然后进行自定义,设置流程符合您的需求。

我们为每周更新新数据的应用程序做了这样的事情。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM