【问题标题】:Running a .Net application from a compressed "zip" file从压缩的“zip”文件运行 .Net 应用程序
【发布时间】:2011-07-19 00:18:20
【问题描述】:

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

但是这个问题的答案提供了一个明确的解决方案。

【问题讨论】:

    标签: .net zip exe


    【解决方案1】:

    这是不可能的,因为 ZIP 中的其他文件需要解压缩才能被 .exe 使用。

    【讨论】:

    • 这是有道理的。在解决方案方面,我觉得我需要一个工具来将 EXE 及其相关文件打包到单个 EXE 中。似乎 NBox 可能会有所帮助:nbox.codeplex.com
    • 在盒子上似乎是一个很好的解决方案,希望它对你有用!
    【解决方案2】:

    有可能吗?好吧,让我们看看这里的情况。

    zip 是一种存档格式。它没有指定magic number;而是通过文件中任何位置存在的标记记录(zip 条目)来识别 zip 文件。

    在 Windows 中,EXE 是一种由幻数定义的文件格式。它允许在文件中包含任意数据和特殊标记的位置。

    将两者结合起来,文件既可以是 exe 也可以是 zip。在生成self-extracting zip files (SFX) 时利用了这种可能性:将自身读取为 zip 文件并提取其中包含的条目的 exe。 SFX 基本上由一些知道如何读取和提取任何 zip 文件的“存根”exe 逻辑以及一组可变的 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 可以免费使用。

    【讨论】:

    • DotNetZip 看起来很有希望。干得好芝士!快速提问:RemoveUnpackedFilesAfterExecute 属性的描述:“执行 PostUnpackCommand 后是否删除已解包的文件。”这个“PostUnpackCommand”在哪里,我在文档中找不到?
    • 可能是文档错误。它应该是PostExtractCommandLine。运行命令后,是否要删除已解压的文件?
    • 这就是我的怀疑。我会告诉给 dpchiesa 一个评论来修复...开玩笑。是的,我想删除文件。我将对此进行测试,看看是否能从这个库中得到我需要的东西。
    • SelfExtractorOptions 需要什么参考?
    • Ionic.Zip.SelfExtractorSaveOptions 选项 = new Ionic.Zip.SelfExtractorSaveOptions();
    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多