【问题标题】:Unzipping on the fly in C#在 C# 中即时解压缩
【发布时间】:2010-08-16 19:48:53
【问题描述】:

我已经构建了一个控制台应用程序,当它从 Program Files 引用 .exe 文件时可以正常工作,但我的用户在他们的 Program Files 目录中可能没有该 .exe。

为了简单起见,我更愿意将包保留为单个 .exe,所以我想知道如何将两个 .exe 合并到一个包中。

我想到的一件事是将 .exe 从 Program Files 目录压缩到一个临时位置,然后我会将 zip 存档的二进制数据存储在我的控制台应用程序源代码中。这是最好的方法还是有更好的方法?

请注意,我没有要在控制台应用程序中引用的 .exe 的源代码。

【问题讨论】:

    标签: c# zip


    【解决方案1】:

    您当然可以将额外文件作为嵌入式资源存储在您的 .exe(或 .dll)中。只需将项目中项目的“构建操作”更改为“嵌入式资源”即可。您可以使用以下命令检索文件的内容(如果您愿意,可以对其进行压缩): System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("stream name")

    您可以将文件提取到磁盘上以便能够引用它,或者您可以使用 Assembly.Load() 变体之一直接加载它,这样您就不需要将它存储在磁盘上。

    请注意,如果您确实选择将其解压缩并将其存储在磁盘上,则需要 Vista 和 Windows 7(以及正确管理的 XP)操作系统的管理员权限才能将文件保存到 Program Files目录。

    【讨论】:

    • 这正是我想要的,谢谢。提取到像C:\tmp 这样的位置需要管理员权限吗?虽然这不是一个真正的问题。谢谢。 :)
    • 可能,取决于安全性的设置方式。您最安全的选择是使用System.IO.Path.GetTempPath() 来查找本地临时目录。
    【解决方案2】:

    您可以使用GZipStream 来压缩和解压缩 C# 中的文件。对于更复杂的压缩,您可以使用其他 Zip 库,例如 SharpZipLib

    【讨论】:

    • 是的。我在压缩/解压缩方面没有问题,只是想知道在我的源代码中存储存档二进制数据的最佳方法是什么,以及它是否可能。例如,我有一个名为“programSource”的字符串,我可以用它制作一个文件,然后我就可以在该存档上运行典型的解压缩方法来获取我想要的文件。谢谢。
    【解决方案3】:

    看看这个链接:Embedding assemblies inside another assembly

    基本上,ILMerge 会满足您的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2011-04-08
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多