从压缩的“zip”文件运行.Net应用程序

时间:2011-03-20 04:10:07

标签: .net zip exe

我需要创建一个轻量级的.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

然而,这个问题的答案提供了一个明确的解决方案。

2 个答案:

答案 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使用之前需要被提取。