【发布时间】: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