C#从字节运行

C#从字节运行,c#,.net,reflection,assemblies,byte,C#,.net,Reflection,Assemblies,Byte,我正在努力让我的客户端通过下载字节并使用反射打开另一个程序。我目前在C#控制台应用程序上实现了这一点,但当我尝试在Windows窗体应用程序上实现这一点时,会出现此错误 “调用的目标已引发异常。” 这是密码 using System; using System.IO; using System.Net; using System.Reflection; using System.Text; private void listBox1_DoubleClick(object sender,

我正在努力让我的客户端通过下载字节并使用反射打开另一个程序。我目前在C#控制台应用程序上实现了这一点,但当我尝试在Windows窗体应用程序上实现这一点时,会出现此错误

“调用的目标已引发异常。”

这是密码

using System;
using System.IO;
using System.Net;
using System.Reflection;
using System.Text;
    private void listBox1_DoubleClick(object sender, EventArgs e)
    {
        if (listBox1.SelectedItem.ToString() != null)
        {
            if (MessageBox.Show("Run " + listBox1.SelectedItem.ToString() + "?", "Run this program?", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                byte[] bytes;
                using (WebClient client = new WebClient())
                {
                    bytes = client.DownloadData(new Uri("http://example.net/program.exe"));
                }
                RunFromBytes(bytes);
            }
        }
    }
    private static void RunFromBytes(byte[] bytes)
    {
        Assembly exeAssembly = Assembly.Load(bytes);
        exeAssembly.EntryPoint.Invoke(null, null);
    }

这是因为您正试图从另一个线程访问表单控件。
请参见此处:

您必须执行以下操作:

  • 创建一个新的
  • 将字节数组写入文件
  • 通过
    ExecuteAssembly
  • 代码如下:

    File.WriteAllBytes("yourApplication.exe", bytes);
    AppDomain newDomain= AppDomain.CreateDomain("newDomain");
    newDomain.ExecuteAssembly("file.exe");
    
    祝你好运

    您可以这样做:

    private static void RunFromBytes(byte[] bytes)
    {
    
    Assembly exeAssembly = Assembly.Load(bytes);
    var entryPoint = exeAssembly.EntryPoint;
    var parms = exeAssembly.CreateInstance(entryPoint.Name);
     entryPoint.Invoke(parms, null);
    }
    

    您能否提供堆栈跟踪(以及内部异常的详细信息,如果有的话)?+1我的假设是相同的:您在一个不常见的场景中遇到了一个常见错误。还要检查stackoverflow,以了解winforms线程问题的答案。您可能会找到合适的答案。添加一些解释,说明此答案如何帮助您解决当前问题