Я знаю, что название звучит немного ошеломляюще, однако ключевая концепция проста.
Я не слишком требователен к языку, это может быть любой язык .NET, но я предпочитаю C ++.
Я хочу сохранить скомпилированный исполняемый файл внутри другого исполняемого файла, который во время выполнения будет запускать другой исполняемый файл из памяти, а не с диска.
Возможно ли это, и если да, то кто-нибудь может привести пример?
Я не имею в виду DLL. Я говорю о независимом исполняемом файле.
Вам нужно что-то на диске, чтобы обойтись, это никак не обойти. Вы можете сделать свой собственный исполняемый файл тем, что вы используете для загрузки другого исполняемого файла. Ваша хост-программа будет выглядеть примерно так:
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» в качестве «встроенного ресурса» в исполняемом файле вашего хостинга.
Вы можете создать заглушку EXE в C #, которая загружает сборку из байтов, используя IPC из вашего процесса, а затем использует отражение, чтобы найти и запустить Main()
метод
Однако этот EXE все равно нужно будет запускать с диска.