执行在可执行文件内打包的新的完全独立的进程,而不将文件写入磁盘以进行单独的处理

时间:2013-12-08 22:48:34

标签: c# c++ .net

我知道标题听起来有点压倒性,但关键概念很简单。

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

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

这是否可能,如果有,请有人提供一个例子吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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”作为“嵌入式资源”。