17

Tôi muốn biết nếu tôi có thể nắm bắt những trường hợp ngoại lệ unhandled ném bởi một quá trình mà tôi bắt đầu sử dụng Process.Start (...)bắt quá trình khác ngoại lệ unhandled

Tôi biết tôi có thể bắt lỗi Standered sử dụng này link, nhưng những gì tôi muốn là để bắt lỗi thường bị bắt bởi trình gỡ lỗi chỉ trong thời gian của môi trường.net, cửa sổ với các từ sau đây: "Một ngoại lệ chưa được xử lý đã xảy ra trong ứng dụng của bạn. Nếu bạn tiếp tục, Ứng dụng sẽ bỏ qua lỗi này và cố gắng tiếp tục. Nếu bạn nhấp vào Thoát, ứng dụng sẽ bị tắt ngay lập tức .... " Sau đó, sau đó là thông báo ngoại lệ và nút" Tiếp tục "và" Thoát ".

Xin cảm ơn trước.

+0

Tôi muốn tìm hiểu Nếu tôi bằng cách nào đó có thể nhấn vào mã của quy trình đang chạy khác và thêm trình xử lý sự kiện vào sự kiện AppDomain.UnhandledException. Cảm ơn các bạn đã giúp đỡ –

+0

Tôi nghĩ là đúng, không có vấn đề gì có giải pháp tùy chỉnh chính xác. nó có giá trị một shot mặc dù. –

Trả lời

6

Nếu bạn đang gọi đến một hội đồng thi Net bạn có thể tải nó và (có nguy cơ của riêng bạn: D) gọi đến phương thức Main của lớp Chương trình vào một tuyên bố 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; 
} 
} 

Nhưng hãy nhận thức được những rủi ro bảo mật mà bạn đang giới thiệu khi thực hiện điều đó.

+0

Tôi nghĩ rằng đây là câu trả lời chính xác Tôi hiện đang tìm kiếm Cảm ơn bạn rất sir. P.S. trong thực hiện của tôi, tôi nghĩ rằng im sẽ thêm lắp ráp mới được nạp vào một AppDomain mới. –

+0

Tôi phải hỏi ở đây, có cách nào để tìm hiểu xem exe là một hội đồng thực thi .net? nếu ứng dụng ở dưới .net 2.0 trong khi ứng dụng còn lại là 3.5, điều đó có quan trọng không? –

+0

Tôi đã cố gắng gọi hàm tạo bằng cách sử dụng phương thức GetConstructor(). Nhưng nó không làm việc cho tôi. Bạn có thể vui lòng chia sẻ ý tưởng hoặc mã mẫu để đạt được điều này không? –

2

No. Nếu ứng dụng được kiểm soát sử dụng chuẩnError và mã trả lại, bạn có thể được thông báo về lỗi xảy ra hoặc ngoại lệ nhưng bạn không thể bẫy nó theo bất kỳ cách nào.

+0

+1 vì không cố gắng phòng hộ bất cứ thứ gì. –

11

Bạn có thể thử một cái gì đó như thế để tránh những câu hỏi debugger để xuất hiện, bạn sẽ không nhận được ngoại lệ nhưng chỉ có exit code:

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"); 
    } 

} 

Trong this question họ đã cung cấp một workaround cho điều đó, nhưng thay đổi một số giá trị đăng ký.

+0

Tôi không nghĩ rằng đây là những gì tôi đang tìm kiếm 10x để được trợ giúp anyway –

1

Thay vì làm toàn bộ lén lút xung quanh hội đồng để cố gắng tìm phương pháp chính như trong câu trả lời của jmservera, bạn chỉ có thể thực hiện việc lắp ráp trong một tên miền mới. Xem this msdn article

0

Trong giải quyết vấn đề về yêu cầu mục tiêu trước đó, cuối cùng tôi kết thúc bằng phương thức dưới đây.

Một số ứng dụng của bạn sẽ có các phụ thuộc trong thư mục hiện tại, dẫn đến ngoại lệ bất cứ khi nào nó được thực thi trong thư mục khác vì các phụ thuộc không khớp.

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 (file)); // bằng cách tham chiếu đến ngoại lệ yêu cầu mục tiêu thư mục hiện tại sẽ được giải quyết.