【问题标题】:Start C# console application from Byte Array [duplicate]从字节数组启动 C# 控制台应用程序 [重复]
【发布时间】:2018-12-27 18:32:38
【问题描述】:

我想通过从字节数组加载来启动一个 C#控制台应用程序

如果我将应用程序写入磁盘并手动启动程序,它会启动,这意味着字节被正确读取。

我尝试了网上找到的各种sn-ps,例如:

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 应用程序,但不适用于控制台应用程序。

【问题讨论】:

  • 行不通是什么意思?你得到一个例外吗?什么都没有发生?
  • 如果您希望 Windows 启动一个新进程(打开单独的控制台应用程序需要这样做),这些字节必须存在于磁盘上,而不仅仅是内存中。
  • 最后一行的“visual application c#”是什么意思? Winforms?
  • 不适用于那些控制台应用程序,因为如果您启动它们,您需要为它们提供可视的标准输入/标准输出以在您的应用程序运行.启动一个线程不会启动一个新的独立进程。
  • @Broots Waymb 我没有得到任何异常,该进程无限期保持活动状态

标签: c# arrays


【解决方案1】:

您获取程序的字节,然后您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多