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