我知道有几个库允许我从zip中提取文件(DotnetZip、SharpZipLib等),但是执行提取的可执行文件是否可能位于从中提取特定文件的同一zip文件中?
这是我的愿景:
1) 用户双击zip文件以查看其内容。2) 双击exe3) 该exe从包含它的zip中提取一些文件,并将其提取到指定的目录中4) 该目录现在具有所需的文件。5) 运行此目录中的exe。
我知道,这听起来很像现有的SFX解决方案。然而,这些似乎都无法满足我在这个问题中描述的需求:如何构建一个作为单个独立文件/实体(无安装程序)分发的.Net应用程序?
我知道这些要求听起来很奇怪。如果我可以更改Powers That Be,我只需要提供一个MSI和一两个XML文件来进行配置。
当然,我欢迎批判性的反馈和问题。
除非从端到端控制流程,否则您真的无法做到这一点。
当您在Windows中双击zip文件(从XP开始)时,它会显示内容。当您双击zip中的文件时,它会将该文件复制到一个临时目录,然后从那里执行您的文件(或将适当的shell处理程序应用于该文件)。
当这种情况发生时,可执行文件(或处理文件类型的可执行文件)不会得到任何特殊的参数/环境变量/指示符,它们会说"嘿,我在zip中",就文件而言,你只是在另一个目录中。
此外,shell并不是唯一一个可以处理.zip文件类型的程序;有很多实用程序可以,它们都会以不同的方式处理双击zip中的文件。
当然,他们可能都使用一个临时目录将文件复制到,但没有任何东西迫使他们(按照惯例或通过API)以相同的方式进行复制。
如果你要这样做,那么你真的必须分发一个EXE,它将从头到尾控制zip进程(你可以将真正的可执行文件打包为文件中的资源)。
自解压exe就是为此而发明的。
这个引导程序可能是最好的C(++),或者不依赖于运行时的东西,很少有没有.net的窗口框,但如果你遇到了一个,你就无法控制安装程序的失败。。。。