Introduction
This example shows how to load an application and run it from the memory system. After the application load, you can use it without the source EXE file (usually blocked from the system). This is useful when you don't need to have the source EXE file on HDD (e.g. on a USB key).
Using the Code
This example is divided into two simple steps:
- The binary reading of the EXE file
- Its loading into the Assembly cache of the read result
First Step
Load the EXE file in one stream and read it as an array of bytes:
FileStream fs = new FileStream(filePath, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
fs.Close();
br.Close();
Using the FileStream
class, it is possible to open the EXE file (location indicated in the filePath
variable), read and close it to release resources.
Second Step
Use the Assembly.Load
method to load the EXE file (as array of bytes) into the Assembly cache:
Assembly a = Assembly.Load(bin);
Now we can try to find the entry point of the application:
MethodInfo method = a.EntryPoint;
if (method != null) {
...
}
If an entry point is found, is possible to create an instance of the application Main
method and invoke it from our application launcher:
object o = a.CreateInstance(method.Name);
method.Invoke(o, null);
If all will be ok, the called application will start without using the source EXE file (try to move it to check).
In the demo project zip file, I put a simple application launches one EXE file found in the same folder of the launcher EXE. If there are more than one files, a request file Form starts to ask the user which file to select from the folder.
NOTE: Pay attention to the Application.SetCompatibleTextRenderingDefault
method of the called application. Visual Studio 2005 applies this line in the Main
method (located inside the Program.cs file) to use the new GDI+ library in our applications, but it will throw an exception because it must be called before the first IWin32Window
object is created.
History
- 24th April, 2006: Initial post