我需要创建一个轻量级的.Net应用程序,可以轻松分发(例如通过电子邮件附件)。我可以从ZIP运行EXE,但是当从zip运行时,我似乎无法让EXE引用任何外部配置文件(例如exe.config或任何其他XML文件)。
当EXE使用exe.config文件中的数据时,是否无法从zip文件运行EXE?
我已经回顾了这个问题:
.NET windows application, can it be compressed into a single .exe?
但我认为他正试图解决与我不同的问题。
我相信我的问题与此类似: Wrap files in one executable package
然而,这个问题的答案提供了一个明确的解决方案。
答案 0 :(得分:4)
有可能吗?那么让我们来看看这里的情况。
zip是一种存档格式。它没有指定magic number;而是通过文件中任何位置存在标记记录(zip条目)来识别zip文件。
在Windows中,EXE是由幻数定义的文件格式。它允许在文件中包含任意数据和特殊标记的位置。
结合这两者,文件可以是exe和zip。这种可能性在产生self-extracting zip files (SFX)时被利用:一个将自己读作zip文件的exe并提取其中包含的条目。 SFX基本上由一些“stub”exe逻辑组成,它知道如何读取和提取任何zip文件,以及一组可变的zip条目记录。
您的要求 - 提取自身,然后从提取的内容运行特定文件的存档格式 - 需要一个仅比标准文件稍微强大的SFX存根。它必须提取文件,然后运行其中一个文件。
DotNetZip是一个基于.NET的zip库,允许您的.NET应用程序生成zip文件,包括SFX文件。 DotNetZip提供的SFX存根包括在提取后调用其中一个提取文件的功能。提取后的命令不一定是.NET可执行文件,但它可能是。当然,由于已经解压缩了exe及其配置文件,因此exe可以成功运行,并且可以访问.config文件。这应该符合您的要求。
在使用DotNetZip生成运行后提取命令的SFX的代码中,如下所示:
string DirectoryPath = "c:\\Documents\\Project7";
using (ZipFile zip = new ZipFile())
{
zip.AddDirectory(DirectoryPath, System.IO.Path.GetFileName(DirectoryPath));
zip.Comment = "This will be embedded into a self-extracting console-based exe";
SelfExtractorOptions options = new SelfExtractorOptions();
options.Flavor = SelfExtractorFlavor.ConsoleApplication;
options.DefaultExtractDirectory = "%USERPROFILE%\\ExtractHere";
options.PostExtractCommandLine = "%USERPROFILE%\\ExtractHere\\MyApp.exe";
options.RemoveUnpackedFilesAfterExecute = true;
zip.SaveSelfExtractor("archive.exe", options);
}
DotNetZip可以免费使用。
答案 1 :(得分:3)
这是不可能的,因为ZIP中的其他文件在被.exe使用之前需要被提取。