process.start()嵌入式exe而不先解压缩到文件c#
我的应用资源中嵌入了可执行文件。 ATM我使用程序集reflection将可执行文件解压缩到自己的文件,然后使用START()启动执行程序。 是否可以直接从流中运行嵌入式可执行文件而不是先将其写入文件? 请有人请告诉我最有效的方法。
以下是我从您的问题中收集的内容以及您的意见:
- 您想知道是否可以执行嵌入到程序中的可执行文件,而无需先将其提取到磁盘
- 您的程序是.NET程序
- 您要执行的可执行文件不是.NET程序
答案是: 是的
然而,答案也是非常非常困难的
你需要做的是,并注意我不知道所有关于这个的细节,因为我不这样做,但无论如何:
- 将可执行代码加载到内存中
- 重新映射二进制映像中的所有地址,以使它们与您加载可执行文件的基址相对应
- 可能加载外部引用,即。 可执行文件需要的其他DLL
- 重新映射这些引用的地址
- 可能加载刚刚加载的引用DLL所需的引用
- 重写那些 dll的
- 重复3到6直到完成
- 调用代码
我假设你的问题是“我可以做1和8”,答案是否定的 。
如果它是.net可执行文件,您应该能够将其加载到appdomain并以这种方式启动它:
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx
实际上很简单:
byte[] bytes = File.ReadAllBytes(path); a = Assembly.Load(bytes);
现在不是从文件中读取字节,而是从资源中读取它,然后就完成了。 实际上有一篇非常好的文章: 动态加载嵌入式资源程序集
如果您不希望它在硬盘驱动器上,您可以将其保存到ram驱动器,然后从那里运行它。
它可以在没有您的原生EXE必须触摸磁盘的情况下完成。
请参阅此处….它显示了作为资源嵌入的“流程”图像的示例。 它被读入内存,然后CreateProcess
和许多其他事情来完成构建一个有效的运行“进程”。