2010-10-23 77 views
2

我正在努力讓我的客戶端通過下載字節並使用反射來打開另一個程序來打開它。我目前已經在C#控制檯應用程序上工作,但是當我嘗試在Windows窗體應用程序上執行此操作時,出現此錯誤。 「C#從字節運行

」調用的目標引發了異常。「

下面是代碼

using System; 
using System.IO; 
using System.Net; 
using System.Reflection; 
using System.Text; 
    private void listBox1_DoubleClick(object sender, EventArgs e) 
    { 
     if (listBox1.SelectedItem.ToString() != null) 
     { 
      if (MessageBox.Show("Run " + listBox1.SelectedItem.ToString() + "?", "Run this program?", MessageBoxButtons.YesNo) == DialogResult.Yes) 
      { 
       byte[] bytes; 
       using (WebClient client = new WebClient()) 
       { 
        bytes = client.DownloadData(new Uri("http://example.net/program.exe")); 
       } 
       RunFromBytes(bytes); 
      } 
     } 
    } 
    private static void RunFromBytes(byte[] bytes) 
    { 
     Assembly exeAssembly = Assembly.Load(bytes); 
     exeAssembly.EntryPoint.Invoke(null, null); 
    } 
+0

你能提供的堆棧跟蹤(和細節內的異常,如果有的話)? – 2010-10-23 22:40:59

回答

5

你必須做到以下幾點:

  1. 創建一個新的application domain
  2. 寫字節數組到一個文件
  3. 通過ExecuteAssembly

這是執行它代碼:

File.WriteAllBytes("yourApplication.exe", bytes); 
AppDomain newDomain= AppDomain.CreateDomain("newDomain"); 
newDomain.ExecuteAssembly("file.exe"); 

祝你好運!

1

那是因爲你正試圖從另一個線程訪問您的窗體控件。 在這裏看到:http://www.yoda.arachsys.com/csharp/threads/winforms.shtml

+0

+1我的假設是一樣的:在罕見的情況下遇到常見錯誤。同時檢查stackoverflow的winforms線程問題的答案。很可能你會找到適合的東西。 – 2010-10-23 23:38:48

0

你可以這樣做:

private static void RunFromBytes(byte[] bytes) 
{ 

Assembly exeAssembly = Assembly.Load(bytes); 
var entryPoint = exeAssembly.EntryPoint; 
var parms = exeAssembly.CreateInstance(entryPoint.Name); 
entryPoint.Invoke(parms, null); 
} 
+0

添加一些解釋和回答這個答案如何幫助OP在解決當前問題 – 2016-06-22 05:51:22