2011-08-28 38 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