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);
}
}
查看异常的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