【发布时间】:2021-09-27 15:52:34
【问题描述】:
我需要将一个可执行文件转换为字节,然后用它启动一个进程。
我现在使用的是这样的:
using System.Reflection;
using System.Threading;
public static class MemoryUtils
{
public static Thread RunFromMemory(byte[] bytes)
{
var thread = new Thread(new ThreadStart(() =>
{
var assembly = Assembly.Load(bytes);
MethodInfo method = assembly.EntryPoint;
if (method != null)
{
method.Invoke(null, null);
}
}));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return thread;
}
}
实施:
var bytes = File.ReadAllBytes(@"C:\myexecutable.exe");
MemoryUtils.RunFromMemory(bytes).Join();
但问题是,它只适用于 32 位的可执行文件,而可执行文件是 64 位的。知道我该怎么做,有什么建议吗?谢谢
我得到的错误:
System.BadImageFormatException: 'Bad IL format.'
【问题讨论】:
-
我确信我以前对 64 位程序集做过类似的事情。您的主机程序 - 它是用 x86、x64 还是 AnyCpu 编译的?也许尝试明确构建为 x64,看看是否有帮助?
-
“它只适用于 32 位进程,可执行文件是 64 位” - 不清楚你的意思。您发布的代码适用于 x64。请更具体。请注意,您加载的文件需要是有效的托管程序集;对于 .NET Core,这通常意味着已编译的 .dll,因为 .exe 只是加载代码的引导程序。
-
@nexxus - 请显示错误消息。 @Ozzah - 我刚刚尝试了在 Visual Studio 中加载默认控制台应用程序的 OP 代码,该应用程序只是将“Hello World”打印为要加载的程序集。使用目标 AnyCPU、x86 和 x64 都抛出了
System.BadImageFormatException: 'Bad IL format.'也许有一些额外的技巧来生成可接受的 COFF exe? -
@dmedine:正如我在评论中指出的,如果您编译 .NET Core 程序,则需要加载生成的 .dll,而不是 .exe。 .exe 只是加载托管程序集的东西;它本身不是托管程序集,不能与
Assembly.Load()一起使用。如果您使用单文件/自包含编译选项之一,则 .exe 也是如此。只有 .NET Core 的“可移植”选项有效,即便如此,也只有加载 .exe 有效。 -
@PeterDuniho- 我没有看到你的评论。以这种方式加载 exe 对我来说确实很奇怪。
标签: c# process executable