我想通过从字节数组加载 C# 控制台应用程序来启动它。
如果我将应用程序写入磁盘并手动启动程序,它将启动,这意味着字节已正确读取。
我尝试了我在网上找到的各种片段,例如:
Assembly a = Assembly.Load(programma);
MethodInfo method = a.EntryPoint;
if (method != null)
{
object o = a.CreateInstance(method.Name);
method.Invoke(o, null);
}
或:
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;
}
这两个代码示例适用于 WinForms 应用程序,但不适用于控制台应用程序。
你获取程序的字节,然后你可以使用 Assembly.Load
从这些字节加载一个Assembly
,找到EntryPoint
,并调用它。
private static void RunBytes(byte[] bytes)
{
Assembly exeAssembly = Assembly.Load(bytes);
var entryPoint = exeAssembly.EntryPoint;
var parms = exeAssembly?.CreateInstance(entryPoint.Name);
entryPoint?.Invoke(parms, null);
}
或者,您可以先将字节写入磁盘,然后尝试改用Assembly.LoadFrom
。