C# - 在运行时将文件添加为我的Exe资源

4
我发现在Visual Studio 2010中,我可以向我的C#资源中添加文件(* .jpg)。据我所知,应该可以在运行时重新组合exe。我不想自己拆开exe。我正在寻找可以帮我完成此操作的C#例程。当然,我不想修改正在运行的exe,而是其副本。如果需要在运行时重新编译它,则我也可以将源代码放入我的exe中。
我的目标:
1. 创建正在运行的exe的副本 2. 以某种方式向该副本添加文件 3. 关闭正在运行的应用程序 4. 当用户执行该副本时,它必须具有作为资源的文件。就是这样。
编辑:目标系统提供C#编译器+Visual Studio 2010。
(我没有编写完整的安装程序,请不要说那些坏话:“重新发明”和“轮子”,我自己知道)

1
你为什么要这样做,只是为了在运行时将文件嵌入到可执行文件中?我不知道“编写完整的安装程序”如何解决问题,但与你建议的方法相比,它需要更少的工作量,并且可能会给你带来更少的问题。 - anton.burger
1
我不确定你在批评什么。我需要找到最好/最简单的方法来完成上述任务。据我所知,stackoverflow有很好的答案。 - Bitterblue
我唯一能想到的东西就是类似于ildasm/ilasm这样的东西。这并不好。但可能有一个API可以实现它。尝试查看Mono,他们有一些很棒的工具和库来支持他们自己的编译器和IDE(MonoDevelop)。 - Lorenzo Dematté
@mini-me 什么批评?我试图确定你为什么想这样做,以便找到更好的替代方案。至少,如果您的可执行文件安装在Program Files中,即使您修改了一份副本,Windows安全性也不会让您替换它,除非您使用管理员令牌运行。您尝试通过使用修改已部署的可执行文件的特定机制来解决什么问题? - anton.burger
如果它确实是一个安装程序,那么考虑使用类似于WiX这样的东西是否有任何不考虑的理由?Windows拥有非常成熟的设置引擎,除了一些例外情况外,完全是数据驱动的;无需编程。 - anton.burger
@shambulator Windows安全不是问题。我不会真的分发那个程序。 - Bitterblue
1个回答

2
您很难在没有完整编译器的情况下修改资源部分而不破坏可执行文件。但您可以做以下事情:
- 制作一个ZIP文件(或包含所有文件的其他存档) - 将ZIP文件的内容进行“愚蠢附加”到可执行文件的末尾 - 附加一个包含存档长度的int32
您可以通过打开一个FileStream来读取它,该FileStream针对自己的可执行文件从ExecutableLength-ZipLength-4开始,并读取ZipLength字节 - 这只给出了zip部分,可以使用DotNetZip或另一个库进行读取。
然后,当您想要修改存储的数据时:
- 在运行时重命名现有的可执行文件(这是可以做到的) - 读取可执行文件的前ExecutableLength-ZipLength-4个字节,并将其写入以前重命名之前的可执行文件名称的新文件中。 - 创建包含信息的新ZIP存档并附加该存档。 - 添加新存档的长度的int32。 - 关闭现有应用程序并启动新应用程序。
Tadah - 可以修改其自身存储资源的可执行文件。

我不确定你是否认为这样做没有帮助,但是有一个完整的编译器可用。 - Bitterblue
如果有一个完整的编译器可用,你可以做一些奇怪的事情,比如将自己的源代码作为资源包含进去并重新构建。但是这并不是一件简单的事情,并且要做到正确 - 我给出的解决方案更简单,工作量也更少。 - PhonicUK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接