我想加载我用我当前的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);
}
}
答案 0 :(得分:1)
查看异常的InnerException属性,以了解导致代码炸弹的实际异常。
您使用的代码肯定是错误的,但实际上并不是失败的原因。 Fwiw,Main()入口点是一个静态方法,您不创建Program类的实例。 method.Invoke(null,null)是正确的方法。
但它不会起作用,你显然是在Winforms应用程序中运行此代码。您尝试加载的程序也是Winforms应用程序。并将尝试使用唯一的Application类对象。这不起作用:
当您从控制台模式应用程序尝试此操作时,它可能看起来。它实际上没有,控制台应用程序的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