我将一个文件的全部字节保存在一个字节数组中,byte[]buffer
在不将该文件复制到磁盘的前提下(这是重要前提!!!),怎么运行该文件?
如果有必要,可以分3种情况(有通用的方法更好):
1.托管exe文件
2.非托管exe文件
3.其他文件(如txt,mp3,avi,chm等文件)
对于托管exe文件,我曾试图用
Assembly.Load(byte[])加载程序集,然后反射调用Main方法来执行,结果失败了如果有通用的、简单的方法就好了
在不将该文件复制到磁盘的前提下(这是重要前提!!!),怎么运行该文件?
如果有必要,可以分3种情况(有通用的方法更好):
1.托管exe文件
2.非托管exe文件
3.其他文件(如txt,mp3,avi,chm等文件)
对于托管exe文件,我曾试图用
Assembly.Load(byte[])加载程序集,然后反射调用Main方法来执行,结果失败了如果有通用的、简单的方法就好了
2.非托管exe文件
3.其他文件(如txt,mp3,avi,chm等文件)
正好搞反。。VC中是没什么办法的。
.NET中是可以的。但必须是托管exe文件才行。也就是楼主所说的1.是你用的方法不对。你用AppDomain创建一个新域 ,然后执行给定的带入口点的程序集就可以了。
当编译器/连接器创建一个可执行程序集时,下面6字节x86 stub函数被嵌入到PE文件的.text部分:JMP _CorExeMain
因为_CorExeMain 函数是从微软的MSCorEE.dll(表示微软组件对象运行时执行引擎:Microsoft Component Object Runtime Execution Engine)中导入的,所以
MSCorEE.dll将在程序集文件的导入(.idata)部分被引用。
当托管EXE文件被调用时,Windows加裁器首先加裁该文件,检查.idata部分以发现MScorEE.dll需要被加裁到该进程的地址空间。然后加加载器获取MSCorEE.dll中_CorExeMain函数的地址,并正托管EXE文件中stub函数的JMP指令。
进程的主线程开始执行x86 stub函数,该函数立即转到MSCorEE.dll中的_CorExeMain,_CorExeMain函数初始化CLR,然后查看可执行程序集的CLR表头以确定该执行哪个托管入口点方法,接着,该入口点方法的IL代码被编译成本地CPU指令,CLR跳转到本地代码(使用进程的主线程)。托管应用程序的代码开始运行。
托管DLL启动CLR过程与托管EXE启动CLR过程类似,只是上述的x86 stub函数为:JMP _CorDLLMain.而且是调用MScorEE.dll中的_CorDllMain函数.