我知道标题听起来有点压倒性,但关键概念很简单。
我对语言不太挑剔,可能是任何.NET语言,但我更喜欢C ++。
我想将已编译的可执行文件存储在另一个可执行文件中,该文件在运行时将从内存运行其他可执行文件,而不是从磁盘运行。
这是否可能,如果有,请有人提供一个例子吗?
我不是指DLL。我在谈论一个独立的可执行文件。
答案 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”作为“嵌入式资源”。