2011-08-28 40 views
0

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

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



    } 

回答

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()。

0

你打电话你的WindowsForm应用程序,这是Main方法EntryPointCreateInstance。你不能这样做。

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

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

+0

嗨,当你说“你的WindowsForm应用程序”,你指的是哪一个?如果我在控制台窗口应用程序中编码它,并尝试从内存执行“load.exe”,它的工作原理。但是,如果我使用Windows窗体应用程序从内存执行“load.exe”,它会失败。 – RStyle

+0

我在说你要加载的应用程序 – Tigran