C # запускается из байтов - PullRequest
       3

C # запускается из байтов

2 голосов
/ 24 октября 2010

Я работаю над тем, чтобы мой клиент открыл другую программу, загрузив байты и используя отражение, чтобы открыть ее. В настоящее время у меня это работает в Консольном приложении C #, но когда я пытаюсь сделать это в приложении Windows Form, я получаю эту ошибку.

"Исключение было сгенерировано целью вызова."

Вот код

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);
    }

Ответы [ 3 ]

5 голосов
/ 24 октября 2010

Вы должны сделать следующее:

  1. Создать новый домен приложения
  2. Записать массив байтов в файл
  3. Выполнить егоExecuteAssembly

Это код:

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

Удачи!

1 голос
/ 24 октября 2010

Это потому, что вы пытаетесь получить доступ к элементам управления формы из другого потока. см. здесь: http://www.yoda.arachsys.com/csharp/threads/winforms.shtml

0 голосов
/ 22 июня 2016

Вы можете сделать как:

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);
}
...