Running executable from MemoryStream / Resources / binary array

Be aware, that executables or assemblies loaded in such manner share main application (host) domain. This implies that if there is any reference needed other from GAC (GlobalAssemblyCache) or host working directory - you will need to handle AppDomain.CurrentDomain.AssemblyResolve event or create new AppDomain for example. Sample code:
using System;
using System.IO;
using System.Reflection;
namespace ExecutableMemoryStream
    class Program
        static void Main(string[] args)
                if (args.Length == 0)
                    throw new TargetParameterCountException(
                             "Expected at least one parameter containing executable path.");
                using (FileStream fileStream = new FileStream(args[0], FileMode.Open))
                using (BinaryReader reader = new BinaryReader(fileStream))
                    byte[] bin = reader.ReadBytes(Convert.ToInt32(fileStream.Length));
                    Assembly assembly = Assembly.Load(bin);
                    MethodInfo method = assembly.EntryPoint;
                    if (method != null)
                        object o = assembly.CreateInstance(method.ReflectedType.Name);
                        if (method.GetParameters().Length == 0)
                            method.Invoke(o, new object[0]);
                            string[] parameters = new string[args.Length - 1];
                            for (int i = 1; i < args.Length; i++)
                                parameters[i - 1] = args[i];
                            method.Invoke(o, new[] { parameters });
            catch (Exception ex)
                Console.BackgroundColor = ConsoleColor.Red;
                Console.ForegroundColor = ConsoleColor.White;
                Console.BackgroundColor = ConsoleColor.Black;
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Hit 'd' for details. Any other key will terminate application.");
                if (Console.ReadKey(true).KeyChar == 'd')
                    Console.ForegroundColor = ConsoleColor.Gray;
Imports System.IO
Imports System.Reflection
Namespace ExecutableMemoryStream
  Class Program
    Private Shared Sub Main(args As String())
        If args.Length = 0 Then
          Throw New TargetParameterCountException("Expected at least one parameter containing executable path.")
        End If
        Using fileStream As New FileStream(args(0), FileMode.Open)
          Using reader As New BinaryReader(fileStream)
            Dim bin As Byte() = reader.ReadBytes(Convert.ToInt32(fileStream.Length))
            Dim assembly__1 As Assembly = Assembly.Load(bin)
            Dim method As MethodInfo = assembly__1.EntryPoint
            If method IsNot Nothing Then
              Dim o As Object = assembly__1.CreateInstance(method.ReflectedType.Name)
              If method.GetParameters().Length = 0 Then
                method.Invoke(o, New Object(-1) {})
                Dim parameters As String() = New String(args.Length - 2) {}
                For i As Integer = 1 To args.Length - 1
                  parameters(i - 1) = args(i)
                method.Invoke(o, New () {parameters})
              End If
            End If
          End Using
        End Using
      Catch ex As Exception
        Console.BackgroundColor = ConsoleColor.Red
        Console.ForegroundColor = ConsoleColor.White
        Console.BackgroundColor = ConsoleColor.Black
        Console.ForegroundColor = ConsoleColor.Yellow
        Console.WriteLine("Hit 'd' for details. Any other key will terminate application.")
        If Console.ReadKey(True).KeyChar = "d"C Then
          Console.ForegroundColor = ConsoleColor.Gray
        End If
      End Try
    End Sub
  End Class
End Namespace
Below you can find full sources with two dummy applications. Drag & drop .NET executables only (managed) onto ExecutableMemoryStream.exe to load & invoke from memory stream.
[binaries] ExecutableMemoryStream.zip29.29 KB
[sources] ExecutableMemoryStream.zip42.86 KB


Post new comment

  • Lines and paragraphs are automatically recognized. The <br /> line break, <p> paragraph and </p> close paragraph tags are inserted automatically. If paragraphs are not recognized simply add a couple blank lines.

More information about formatting options

This question is for testing whether you are a human visitor and to prevent automated spam submissions.
5 + 1 =
This simple math problem is designed for BOT - you just have to enter '7'.