【问题标题】:Embedding Files into existing .Net Executable将文件嵌入到现有的 .Net 可执行文件中
【发布时间】:2015-05-24 18:47:58
【问题描述】:

我正在编写安装程序。此安装程序应该能够在 .exe 正文中嵌入 1..n 文件。我不想发送 2 个单独的文件(如 .exe 和 .cab)。

首先我尝试了 mono.cecil 变体来添加新的外部资源(每个文件都是单个资源),但我已经达到了它的限制,因为它在内部使用 byte[] 来读取文件并对其进行分析,然后它修改了缓冲和写入。我得到大于 500MB 的文件的内存溢出。我也尝试调试 Mono.Cecil,但没有成功。里面用到了byte[]和MemoryStream,还有它庞大的复杂库试图去改变。

第二:我的想法是将文件简单地添加到 .exe 的尾部并从那里读取它们。我为此使用了一个类:

        // signature is being used to identify the metainformation
        var Tail = new msTailFiles(msTailFiles.RandomSignature(), FN);

        // Add to tail
        foreach (var F in Directory.EnumerateFiles(@"c:\Windows"))
            Tail.AddFile(Path.GetFileName(F), F);

        // Read file info
        var AllFiles = Tail.GetFileNames();

        // Take files from tail and put to filesystem
        foreach (var F in Tail.GetFileNames())
        {
            Tail.GetFile(F, File.Open(@"f:\copy\" + F, FileMode.Create));
        }

使用这种方法,我可以将现有的 .exe 文件扩展到文件系统文件大小限制,这很好。

但是如果我超过 ~ 1.5GB 大小限制我会遇到麻烦,我可以在资源管理器中成功读取 .exe 文件信息,所以我不会破坏 .exe 结构,但是如果我启动这个文件我会得到错误:“这个应用程序可以不能开始。”来自探险家。此外,收到错误消息大约需要 30 秒,看起来 Windows 正在尝试将整个 2GB 加载到内存中或以某种方式进行分析(也许 IL 会?)。 .exe 的版权、大小、类型、所有者、图标等所有元信息仍然显示,所以看起来都不错,但我的风格有些问题。

所以我的问题是:我的问题可能是什么?除了使用 TailFiles() 方法或 Mono.Cecil 方法之外,还有其他建议吗?

【问题讨论】:

    标签: c# resources installation embedding


    【解决方案1】:

    这是我解决这个问题的方法:

    我已将 Target CPU 设置为“Any CPU”,此问题已完全消失。通过这种 TailFiles 方式,我现在可以将无限数量的自定义数据添加到文件的尾部。目前,反病毒软件卡巴斯基并没有对这种不太优雅但非常有效的尾部存储其他文件的方式说任何坏话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 2014-05-24
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      相关资源
      最近更新 更多