C# 执行打包在可执行文件中的新的完全独立的进程,而无需将文件写入磁盘以进行独立进程

C# 执行打包在可执行文件中的新的完全独立的进程,而无需将文件写入磁盘以进行独立进程,c#,c++,.net,C#,C++,.net,我知道这个标题听起来有点让人难以接受,但关键概念很简单 我对语言不太挑剔,它可以是任何.NET语言,但是我更喜欢C++。 我想将一个编译后的可执行文件存储在另一个可执行文件中,该可执行文件在运行时将从内存而不是磁盘运行另一个可执行文件 这可能吗?如果可能的话,有人能举个例子吗 我指的不是DLL。我说的是一个独立的可执行文件。您可以在C#中创建一个存根EXE,它使用进程中的IPC从字节加载程序集,然后使用反射来查找并运行Main()方法 但是,该EXE仍然需要从磁盘上运行。您需要磁盘上的某些东西才

我知道这个标题听起来有点让人难以接受,但关键概念很简单

我对语言不太挑剔,它可以是任何.NET语言,但是我更喜欢C++。 我想将一个编译后的可执行文件存储在另一个可执行文件中,该可执行文件在运行时将从内存而不是磁盘运行另一个可执行文件

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


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

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


但是,该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”作为“嵌入式资源”。

AFAIK,这在Windows上是完全不可能的;你需要从磁盘上执行一些EXE文件。我坚信这是可能的,因为计算机上的任何东西在一定程度上都是开放的。我个人并不知道如何去做,这正是
fork()可以。“第二个可执行文件”是子进程运行的代码体。@选择“是”,即包含打包的可执行文件的可执行文件。看看可执行的打包程序,比如UPX@Gene除了他想要的不是为同一个可执行文件派生一个新进程,而是将另一个可执行文件解包到内存中并运行它。这不是fork()的工作。
。等我有事情回来,我会调查一下。我几分钟后就得走了。