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

DSO*_*DSO 6 c# installation

我有一个具有复杂设置要求的应用程序.我非常熟悉一些用于创建安装程序的工具,例如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并重建.

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

Gra*_*meF 0

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