问题描述
我现在使用的是:
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.'
解决方法
但问题是,它只适用于 32 位进程,并且可执行文件是 64 位。关于我如何做到这一点的任何想法,有什么建议吗?
目前还不清楚您遇到了什么错误,或者您所说的“仅适用于 32 位进程”是什么意思。但是,我怀疑您正在尝试加载错误的文件。
不可移植的 .NET Core .exe 不是有效的托管程序集。如果您希望能够使用 Assembly.Load()
加载 .NET Core 程序,则必须将其编译为可移植程序集,并且必须加载生成的 .dll 文件,而不是.exe(后者只是知道如何运行 .dll 的小存根)。
因此,您需要:
- 确保您将
myexecutable.csproj
编译/发布为可移植程序集,并且 - 确保加载
myexecutable.dll
,而不是myexecutable.exe
(即var bytes = File.ReadAllBytes(@"C:\myexecutable.dll");
)
有关编译 .NET Core 程序的各种方法的更多详细信息,请参阅 Build .NET Core console application to output an EXE。