17

मैं अगर मैं एक और प्रक्रिया है जो मैं Process.Start (...)पकड़ किसी अन्य प्रक्रिया बिना क्रिया का अपवाद

का उपयोग कर मैं जानता हूँ कि मैं इस का उपयोग कर standered त्रुटि पकड़ कर सकते हैं शुरू कर दिया द्वारा फेंका बिना क्रिया अपवाद पकड़ कर सकते हैं पता करना चाहते हैं link, लेकिन मैं जो चाहता हूं वह उस त्रुटि को पकड़ना है जो आमतौर पर.net पर्यावरण के जस्ट इन टाइम डीबगर द्वारा पकड़ा जाता है, निम्न शब्दों वाले विंडो: "आपके एप्लिकेशन में एक अनचाहे अपवाद हुआ है। अगर आप जारी रखते हैं, एप्लिकेशन इस त्रुटि को अनदेखा कर देगा और जारी रखने का प्रयास करेगा। अगर आप बाहर निकलें क्लिक करते हैं, तो एप्लिकेशन तुरंत बंद हो जाएगा .... " इसके बाद अपवाद संदेश और" जारी रखें "और" छोड़ें "बटन का पालन किया जाता है।

अग्रिम धन्यवाद।

+0

मैं यह जानना चाहता हूं कि अगर मैं किसी अन्य तरह की चल रही प्रक्रिया के कोड में टैप कर सकता हूं और AppDomain.UnhandledException ईवेंट में इवेंट हैंडलर जोड़ सकता हूं। मदद लोगों के लिए धन्यवाद –

+0

मुझे लगता है कि आप सही हैं, कोई समस्या सटीक अनुकूलित समाधान नहीं है। हालांकि यह एक शॉट के लायक है। कुछ भी बचाव करने की कोशिश नहीं करने के लिए –

उत्तर

6

आप एक नेट निष्पादन विधानसभा के लिए बुला रहे हैं, तो आप इसे लोड कर सकते हैं और (अपने जोखिम पर: डी) एक 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

मुझे लगता है कि यह सही जवाब है जिसे मैं वर्तमान में देख रहा हूं, धन्यवाद। पीएस मेरे कार्यान्वयन में, मुझे लगता है कि मैं नई लोडेड असेंबली को एक नए ऐपडोमेन में जोड़ने जा रहा हूं। –

+0

मुझे यहां पूछना होगा, क्या यह पता लगाने का कोई तरीका है कि exe एक .net निष्पादन योग्य असेंबली है या नहीं? क्या होगा यदि एप्लिकेशन .NET 2.0 के अंतर्गत है, जबकि दूसरा 3.5 है, तो क्या इससे कोई फर्क पड़ता है? –

+0

मैंने GetConstructor() विधि का उपयोग कर निर्माता को आमंत्रित करने का प्रयास किया। लेकिन यह मेरे लिए काम नहीं कर रहा है। क्या आप इसे प्राप्त करने के लिए कोई विचार या नमूना कोड साझा कर सकते हैं? –

2

नहीं। यदि नियंत्रित ऐप मानक त्रुटि का उपयोग करता है और कोड लौटाता है तो आपको किसी त्रुटि या अपवाद के अवसर की अधिसूचना दी जा सकती है लेकिन आप इसे किसी भी तरह से फंस नहीं सकते हैं।

+0

+1। –

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 की मदद के लिए देख रहा हूं –

1

जेएमएसरवेरा के उत्तर में मुख्य विधि खोजने की कोशिश करने के लिए असेंबली के चारों ओर पूरी तरह से चुपके करने के बजाय, आप बस एक नए डोमेन में असेंबली निष्पादित कर सकते हैं। 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 (फ़ाइल)); // वर्तमान निर्देशिका लक्ष्य आमंत्रण अपवाद को refering द्वारा हल किया जाएगा।

संबंधित मुद्दे