将文件嵌入到现有的.Net可执行文件中

时间:2015-05-24 18:47:59

标签: c# resources installer embedding

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

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

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

.element {
  position: relative;
}
.element:after {
  content: ''; /* Generate a pseudo-element with no content */
  position: absolute;
  left: 1%;
  right: 1%;
  bottom: 0; /* Increase this to achieve the "a bit to the top" */
  height: 1px;
  background: black;
}

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

但是我遇到麻烦,如果我超过1.5GB sizelimit,我可以成功读取探险家的.exe文件信息,所以我不打破.exe结构,但如果我启动这个文件我得到错误:“这个应用程序可以不要开始。“来自探险家。此外,它需要大约30秒来获取错误消息,它看起来像Windows试图将整个2GB加载到内存或分析某种方式(也许IL会吗?)。所有的元信息,如版权,大小,类型,所有者,.exe的图标仍然显示,所以看起来都很好,但是我的风格有问题。

所以我的问题是:我的问题可能是什么?有没有人有任何其他建议,而不是使用TailFiles()方法或Mono.Cecil方法?

1 个答案:

答案 0 :(得分:0)

以下是我如何解决这个问题:

我已将目标CPU置于“任何CPU”,此问题已完全消失。使用这种TailFiles方式,我现在可以向文件的尾部添加无限数量的自定义数据。就目前而言,反病毒软件卡巴斯基并没有对这种不太优雅的非常有效的存储其他文件的方式说不好。