Es muy posible, lo he hecho yo mismo, pero es complicado y más aún desde código administrado. No hay una API .NET para ella, ni hay una API nativa para la que pueda invocar. Por lo tanto, tendrá que controlar la carga manualmente, lo que requerirá cierto conocimiento del formato de archivo PE (Portable Executable) utilizado para módulos como DLL y EXEs - http://msdn.microsoft.com/en-us/magazine/cc301805.aspx. Habrá mucha manipulación del puntero (obligando el uso de bloques {} inseguros) y PInvoke.
Primero cargue el archivo PE en la memoria (o use MapViewOfFile). Un archivo PE está formado internamente por diferentes secciones que contienen código, datos o recursos. Los desplazamientos de cada sección en el archivo no siempre coinciden con los desplazamientos en memoria previstos, por lo que se requieren algunos ajustes menores.
Cada archivo PE supone que se cargará en una determinada dirección base en la memoria virtual. A menos que pueda garantizar esto, deberá recorrer la tabla de reubicación del archivo PE para ajustar los punteros en consecuencia.
Cada archivo PE también tiene una tabla de importación que enumera las funciones de otras DLL a las que desea llamar. Tendrá que recorrer esta tabla y llamar a LoadLibrary()/GetProcAddress() para completar cada importación.
A continuación, la protección de memoria debe ajustarse correctamente para cada sección. El encabezado de cada sección indica la protección que desea, por lo que solo es cuestión de llamar a VirtualProtect() para cada sección con los indicadores correctos. Como mínimo, necesitará VirtualProtect el módulo cargado con PAGE_EXECUTE_READWRITE o es poco probable que pueda ejecutar ningún código.
Por último, para una DLL debe llamar a su punto de entrada, cuya dirección se puede encontrar en el encabezado PE; a continuación, puede llamar libremente a las funciones exportadas.
Dado que desea ejecutar un EXE, tiene algunos dolores de cabeza adicionales. Puede simplemente hacer girar un nuevo hilo y llamar al punto de entrada del EXE, pero muchos EXE se pueden alterar ya que el proceso está configurado para usted, no el EXE. También puede matar tu proceso cuando intenta salir. Es posible que desee generar un nuevo proceso, por lo tanto, quizás otra copia de su EXE principal con argumentos especiales para decirle que va a ejecutar un código diferente, en cuyo caso tendrá que guardar el EXE en su espacio de memoria. Probablemente quieras hacer la mayor parte del trabajo anterior en el nuevo proceso, no en el anterior. Puede crear un conducto con nombre y enviar los datos de un EXE a otro, o asignar un área de memoria compartida con MapViewOfFile.Por supuesto, el EXE aún puede molestarse, ya que el proceso en el que se ejecuta todavía no es el suyo.
en general, es mucho más fácil simplemente escribir en un archivo temporal y luego usar Process.Start().
Si aún desea hacerlo de la manera difícil, echar un vistazo a este ejemplo de código no administrado: http://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/. Esto no cubre archivos ejecutables, solo archivos DLL, pero si el código en el mismo no te asusta, estaría bien extender el proceso para que cubra los archivos ejecutables.
http://stackoverflow.com/questions/1224149/how-to-run-unmanaged-executable-from-memory-rather-than-disc –
¿Por qué no quieres crear un archivo temporal? – Kramii
porque prefiero ejecutar código limpio sin tener que crear archivos temporales todo el tiempo. si lo ejecuto en la memoria, no tengo que pensar en los derechos de escritura en la carpeta temporal. – MichaelD