TargetInvocationException从内存加载Exe时

本文关键字:Exe 加载 内存 TargetInvocationException | 更新日期: 2023-09-27 18:07:03

我想加载另一个c# windows窗体应用程序,我用我当前的windows窗体应用程序创建的。我想从内存中加载它。然而,我遇到了:

未处理的System.Reflection类型异常。在mscorlib.dll中发生TargetInvocationException'

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

    }

TargetInvocationException从内存加载Exe时

查看异常的InnerException属性,以了解导致代码爆炸的实际异常。

你使用的代码肯定是错误的,但实际上并不是失败的原因。通常,Main()入口点是一个静态方法,您不需要创建Program类的实例。方法。调用(null, null)是正确的方法。

但是它不会工作,你显然是在一个Winforms应用程序中运行这段代码。你试图加载的程序也是一个Winforms应用程序。并且会尝试使用唯一的Application类对象。

  • Application.EnableVisualStyles()将失败,必须在创建任何窗口之前调用
  • Application.Run()将失败,只能有一个活动的消息循环

它可能看起来像,当你在控制台模式应用程序中尝试这个时,它会工作。它实际上没有,控制台应用程序的Main()方法没有[STAThread]属性。GUI应用程序的硬性要求。没有它,许多典型的GUI操作将以神秘的方式失败。任何使用剪贴板、拖放、shell对话框(例如OpenFileDialog)的程序都需要STA线程。

这是行不通的。考虑Process.Start () .

您正在WindowsForm应用程序的EntryPoint上调用CreateInstance,这是Main方法。你不能那样做。

如果你想在该二进制文件中创建某个类型的实例,请使用该类型的完全限定名,以便能够创建该类型的实例。

如果你只想运行这个应用程序,使用Process.Start(exe complete path);

由于EntryPoint是公共+静态的,您不需要/不应该实例化任何东西,只需:

a.EntryPoint.Invoke(null,null);

如果"load.exe"是一个GUI应用程序,然后将其加载到一个新的AppDomain中-例如,参见http://msdn.microsoft.com/en-us/library/ms173139.aspx