执行一个新的完全独立的进程,该进程封装在一个可执行文件中,而不需要为独立进程将文件写入磁盘

Execute a new entirely seperate process packed inside of an executable without a file written to disk for seperate process

本文关键字:进程 独立 一个 磁盘 不需要 文件 执行 可执行文件 封装      更新时间:2023-10-16

我知道这个标题听起来有点让人不知所措,但关键概念很简单。

我对语言不太挑剔,它可以是任何.NET语言,但我更喜欢C++。

我想将已编译的可执行文件存储在另一个可执行文件中,该可执行文件在运行时将从内存运行另一个执行文件,而不是从磁盘运行。

这可能吗?如果可能,请有人举个例子?

我指的不是DLL。我说的是一个独立的可执行文件

您可以在C#中创建一个存根EXE,该EXE使用进程中的IPC从字节加载程序集,然后使用反射查找并运行Main()方法

但是,EXE仍然需要从磁盘上运行。

您需要在磁盘上运行一些东西,这是无法解决的。您可以使自己的可执行文件成为用于加载其他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"作为"嵌入式资源"。