17

我想知道如果我能趕上另一個過程,我開始使用的Process.Start(...)捕捉另一個進程未處理的異常

我知道我可以使用這個趕上standered錯誤拋出的未處理的異常link,但我想要的是捕獲通常由.NET環境的即時調試器捕獲的錯誤,該窗口包含以下字詞: 「應用程序中發生未處理的異常。如果繼續,則應用程序將忽略此錯誤並嘗試繼續,如果您單擊退出,應用程序將立即關閉....「 然後是異常消息和」繼續「和」退出「按鈕。

在此先感謝。

+0

我想知道如果我能以某種方式挖掘其他正在運行的進程的代碼並向AppDomain.UnhandledException事件添加事件處理程序。 感謝您的幫助球員 – 2010-02-17 10:39:27

+0

我認爲你是對的,沒有問題有確切的定製解決方案。它值得一試。 – 2010-02-18 16:15:10

回答

6

如果你打電話給.NET可執行組件可以加載並(在您自己的風險:d)調用程序類的主要方法爲try_catch聲明:

Assembly assembly = Assembly.LoadFrom("ErroneusApp.exe"); 
Type[] types= assembly.GetTypes(); 
foreach (Type t in types) 
{ 
MethodInfo method = t.GetMethod("Main", 
    BindingFlags.Static | BindingFlags.NonPublic); 
if (method != null) 
{ 
    try 
    { 
     method.Invoke(null, null); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
    break; 
} 
} 

但要意識到您正在引入的安全風險。

+0

我認爲這是我目前正在尋找的確切答案 非常感謝先生。 P.S.在我的實現中,我想我會將新加載的程序集添加到新的AppDomain中。 – 2010-02-18 16:12:48

+0

我得問這裏,有沒有辦法找出exe是不是.net可執行程序集? 如果應用程序在.net 2.0下,而另一個是3.5,那該怎麼辦? – 2010-02-18 16:14:22

+0

我試圖使用GetConstructor()方法調用構造函數。但它不適合我。您可以請分享一個想法或示例代碼來實現這一目標嗎? – 2016-05-31 04:53:11

2

否。如果受控程序使用standardError和返回碼,則可能會通知您發生了錯誤或異常,但無法以任何方式進行捕獲。

+0

+1因爲沒有試圖對衝任何東西。 – 2010-02-17 08:27:18

11

您可以嘗試類似的東西,以避免調試器的問題出現,你不會得到例外,但只有退出代碼:他們提供另一種解決方法爲

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      ProcessStartInfo info = 
       new ProcessStartInfo("ErroneusApp.exe"); 
      info.ErrorDialog = false; 
      info.RedirectStandardError = true; 
      info.RedirectStandardOutput = true; 
      info.CreateNoWindow = true; 
      info.UseShellExecute = false; 

      System.Diagnostics.Process p = 
       System.Diagnostics.Process.Start(info); 
      p.EnableRaisingEvents = true; 
      p.Exited += p_Exited; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     Console.ReadLine(); 
    } 


    static void p_Exited(object sender, EventArgs e) 
    { 
     Process p = sender as Process; 
     if (p != null) 
     { 
      Console.WriteLine("Exited with code:{0} ", p.ExitCode); 
     } 
     else 
      Console.WriteLine("exited"); 
    } 

} 

this question,但改變一些註冊表值。

+0

我不認爲這是我所尋找的 10x幫助無論如何 – 2010-02-17 10:36:29

1

而不是整個偷偷摸摸地試着找到Main方法,就像在jmservera的答案中一樣,你可以簡單地在一個新的域中執行程序集。請參閱this msdn article

0

在解決之前的目標調用問題時,最後我以下面的方法結束。

某些應用程序會在當前目錄中存在依賴關係,因爲依賴關係不匹配,導致在其他目錄中執行任何應用程序時會導致異常。

Assembly assembly = Assembly.LoadFrom(file); 
        Directory.SetCurrentDirectory(Path.GetDirectoryName(file)); 
        Type[] types = assembly.GetTypes(); 
        foreach (Type t in types) 
        { 
         MethodInfo method = t.GetMethod("Main", BindingFlags.Static | BindingFlags.NonPublic); 
         if (method != null) 
         { 
          try 
          { 
           method.Invoke(null, null); 
          } 

Directory.SetCurrentDirectory(Path.GetDirectoryName(文件)); //通過引用當前目錄的目標調用異常將被解析。