c # — выполнить новый полностью отдельный процесс, упакованный внутри исполняемого файла без файла, записанного на диск для отдельного процесса

Я знаю, что название звучит немного ошеломляюще, однако ключевая концепция проста.

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

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

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

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

-1

Решение

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

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» в качестве «встроенного ресурса» в исполняемом файле вашего хостинга.

0

Другие решения

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

Однако этот EXE все равно нужно будет запускать с диска.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector