从内存加载Exe时的TargetInvocationException

时间:2011-08-28 10:14:38

标签: c# assemblies invoke

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

mscorlib.dll中发生未处理的“System.Reflection.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);
        }



    }

3 个答案:

答案 0 :(得分:1)

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

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

但它不会起作用,你显然是在Winforms应用程序中运行此代码。您尝试加载的程序也是Winforms应用程序。并将尝试使用唯一的Application类对象。这不起作用:

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

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

这不会飞。考虑Process.Start()。

答案 1 :(得分:0)

您在[{1}}应用的CreateInstance上呼叫EntryPoint,这是WindowsForm方法。你不能这样做。

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

如果您只想运行该应用,请使用Main

答案 2 :(得分:0)

由于EntryPoint是public + static,因此您不需要/不应该实例化任何内容,只需:

a.EntryPoint.Invoke(null,null);

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