TargetInvocationException при загрузке Exe из памяти - PullRequest
0 голосов
/ 28 августа 2011

Я хочу загрузить другое приложение формы C # windows, которое я создал с моим текущим приложением формы windows.Я хочу загрузить его из памяти.Однако я сталкиваюсь с:

Необработанное исключение типа 'System.Reflection.TargetInvocationException' произошло в mscorlib.dll Дополнительная информация: Исключение было сгенерировано целью вызова.

    private void button1_Click(object sender, EventArgs e)
    {

        FileStream _FileStream = new FileStream("load.exe", FileMode.Open);
        BinaryReader _BinaryReader = new BinaryReader(_FileStream);
        byte[] bBytes = _BinaryReader.ReadBytes(Convert.ToInt32(_FileStream.Length));

        _BinaryReader.Close();
        _FileStream.Close();

        Assembly a = Assembly.Load(bBytes);
        MethodInfo method = a.EntryPoint;


        if (method != null)
        {
            object o = a.CreateInstance(method.Name);
            method.Invoke(o,null);
        }



    }

Ответы [ 3 ]

1 голос
/ 28 августа 2011

Посмотрите на свойство InnerException исключения, чтобы узнать фактическое исключение, вызвавшее бомбу кода.

Код, который вы использовали, определенно неверен, но на самом деле не является причиной сбоя.Кстати, точка входа Main () - это статический метод, вы не создаете экземпляр класса Program.method.Invoke (null, null) - правильный путь.

Но это не сработает, вы явно запускаете этот код в приложении Winforms.Программа, которую вы пытаетесь загрузить, также является приложением Winforms.И будет пытаться использовать единственный объект класса приложения.Это не может работать:

  • Application.EnableVisualStyles () завершится ошибкой, его необходимо вызвать до создания любых окон
  • Ошибка Application.Run (),может быть только одна активная петля сообщений

Она может выглядеть так, как это будет работать, когда вы попробуете это из приложения в режиме консоли.На самом деле это не так, метод Main () консольного приложения не имеет атрибута [STAThread].Жесткое требование для приложений с графическим интерфейсом.Без этого многие типичные операции с графическим интерфейсом не получатся загадочным образом.Все, что использует буфер обмена, перетаскивание, диалоги оболочки, такие как OpenFileDialog, например, требует потока STA.Рассмотрим Process.Start ().

0 голосов
/ 28 августа 2011

Поскольку EntryPoint является общедоступным + статическим, вам не нужно ничего создавать / не создавать, просто:

a.EntryPoint.Invoke(null,null);

ЕСЛИ «load.exe» - это приложение с графическим интерфейсом, затем загрузите его в новый AppDomain - пример см. http://msdn.microsoft.com/en-us/library/ms173139.aspx

0 голосов
/ 28 августа 2011

Вы звоните CreateInstance на EntryPoint вашего WindowsForm приложения, которое является Main методом. Тебе этого не сделать.

Если вы хотите создать экземпляр некоторого типа внутри этого двоичного файла, используйте полное имя этого типа, чтобы иметь возможность создать его экземпляр.

Если вы хотите просто запустить это приложение, используйте Process.Start(exe complete path);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...