2013-12-08 4 views
-1

Я знаю, что название звучит немного подавляющим, однако концепция ключа проста.Выполнение нового полностью отдельного процесса, упакованного внутри исполняемого файла без файла, записанного на диск для отдельного процесса

Я не слишком придирчивый к языку, это может быть любой язык .NET, но я предпочитаю C++.

Я хочу сохранить скомпилированный исполняемый файл внутри другого исполняемого файла, который во время выполнения будет запускать другой исполняемый файл из памяти, а не с диска.

Возможно ли это, и если да, то пожалуйста, укажите пример?

Я имею в виду не DLL. Я говорю об отдельном исполняемом файле.

+0

AFAIK, это абсолютно невозможно в Windows; вам нужно выполнить _some_ EXE-файл с диска. – SLaks

+0

Я твердо верю, что это возможно, так как все на компьютере - открытая игровая площадка на определенном уровне. Я просто не знаю, как это сделать. –

+0

Это именно то, что 'fork();' делает. «Второй исполняемый файл» - это тело кода, выполняемого дочерним процессом. – Gene

ответ

0

Вам нужно что-то на диске, чтобы бежать, нет никакого способа обойти это. Вы можете создать собственный исполняемый файл, который вы используете для загрузки другого exe. Ваша программа хоста будет выглядеть примерно так:

class Program 
{ 
    public static void Main(string[] args) 
    { 
     if (args.Length > 0 && args[0] == "launch") 
     { 
      AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 
      AppDomain.CurrentDomain.ExecuteAssemblyByName("TestConsoleApp", "some", "args", DateTime.Now.ToString()); 
     } 
     else 
     { 
      RunNormally(); 
     } 
    } 

    private static void RunNormally() 
    { 
     string fileName = Process.GetCurrentProcess().MainModule.FileName; 
     fileName = fileName.Replace(".vshost", ""); // hack -- if launched in the debugger must remove this. 
     Process.Start(fileName, "launch"); 

     // do other stuff 
    } 

    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var asmName = new AssemblyName(args.Name); 
     var resourceName = Assembly.GetExecutingAssembly().GetManifestResourceNames().FirstOrDefault(r => r.Contains(asmName.Name)); 
     if (resourceName != null) 
     { 
      using (var memoryStream = new MemoryStream()) 
      { 
       Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName).CopyTo(memoryStream); 
       return Assembly.Load(memoryStream.GetBuffer()); 
      } 
     } 

     return null; 
    } 
} 

Это предполагает, что вы есть узел «TestConsoleApp» как «Внедренный ресурс» в хостинговой исполняемый файл.

1

Вы можете создать заглушку EXE в C#, которая загружает сборку из байтов с использованием IPC от вашего процесса, а затем использует отражение, чтобы найти и запустить метод Main()

Однако, что EXE будет еще нужно запустить с диска ,

+0

Я рассмотрю это, как только вернусь от чего-то. Я должен уйти через несколько минут. –

Смежные вопросы