中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么調用外部進程

發布時間:2021-06-24 16:24:48 來源:億速云 閱讀:306 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關C#中怎么調用外部進程,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

執行外部進程的函數

privatestringRunCmd(stringcommand)  {  //例Process  Processp=newProcess();   p.StartInfo.FileName="cmd.exe";//確定程序名  p.StartInfo.Arguments="/c"+command;//確定程式命令行  p.StartInfo.UseShellExecute=false;//Shell的使用  p.StartInfo.RedirectStandardInput=true;//重定向輸入  p.StartInfo.RedirectStandardOutput=true;//重定向輸出  p.StartInfo.RedirectStandardError=true;//重定向輸出錯誤  p.StartInfo.CreateNoWindow=true;//設置置不顯示示窗口   p.Start();//00   //p.StandardInput.WriteLine(command);//也可以用這種方式輸入入要行的命令  //p.StandardInput.WriteLine("exit");//要得加上Exit要不然下一行程式   returnp.StandardOutput.ReadToEnd();//輸出出流取得命令行結果果   }

這個方法應該是比較常見的C#調用外部進程的方法,我以前也一直是這樣調用外部進程的,也沒有碰到過什么問題。但這次調用的外部進程比較特殊,用這種方法調用就出現了兩個問題。

***個問題是這個被調用的外部進程有時候會出現異常,出現異常后Windows會彈出錯誤報告框,程序于是吊死在那里,必須手工干預。這個問題比較好解決,程序中設置一下注冊表搞定。

第二個問題是C#調用外部進程(是一個控制臺進程)后,程序會阻塞在p.StandardOutput.ReadToEnd();這一句,永遠無法出來,被調用的那個控制臺程序也被吊死。但該控制臺進程在CMD 中是可以正常執行的。后來看來一些資料才發現原來原因是出在該控制臺程序控制臺輸出大量字符串,管道重定向后,調用程序沒有及時將管道中的輸出數據取出,結果導致管道被阻塞,程序吊死。在這里還有另外一個問題,雖然這次沒有遇到,但網上有其他人遇到,就是錯誤信息管道不及時取出數據,也會被阻塞,而且如果要同時取出兩個管道的數據,必須要利用一個輔助線程才能實現。

問題講完了,下面給出這個類的完整代碼

  1. usingSystem;  

  2. usingSystem.Collections.Generic;  

  3. usingSystem.Text;  

  4. usingSystem.Runtime.InteropServices;  

  5. usingSystem.Threading;  

  6.  

  7. namespaceLaboratory.Process  

  8. {  

  9. classReadErrorThread  

  10. {  

  11. System.Threading.Threadm_Thread;  

  12. System.Diagnostics.Processm_Process;  

  13. Stringm_Error;  

  14. boolm_HasExisted;  

  15. objectm_LockObj=newobject();  

  16.  

  17. publicStringError  

  18. {  

  19. get  

  20. {  

  21. returnm_Error;  

  22. }  

  23. }  

  24.  

  25. publicboolHasExisted  

  26. {  

  27. get  

  28. {  

  29. lock(m_LockObj)  

  30. {  

  31. returnm_HasExisted;  

  32. }  

  33. }  

  34.  

  35. set  

  36. {  

  37. lock(m_LockObj)  

  38. {  

  39. m_HasExisted=value;  

  40. }  

  41. }  

  42. }  

  43.  

  44. privatevoidReadError()  

  45. {  

  46. StringBuilderstrError=newStringBuilder();  

  47. while(!m_Process.HasExited)  

  48. {  

  49. strError.Append(m_Process.StandardError.ReadLine());  

  50. }  

  51.  

  52. strError.Append(m_Process.StandardError.ReadToEnd());  

  53.  

  54. m_Error=strError.ToString();  

  55. HasExisted=true;  

  56. }  

  57.  

  58. publicReadErrorThread(System.Diagnostics.Processp)  

  59. {  

  60. HasExisted=false;  

  61. m_Error="";  

  62. m_Process=p;  

  63. m_Thread=newThread(newThreadStart(ReadError));  

  64. m_Thread.Start();  

  65. }  

  66.  

  67. }  

  68.  

  69. classRunProcess  

  70. {  

  71. privateStringm_Error;  

  72. privateStringm_Output;  

  73.  

  74. publicStringError  

  75. {  

  76. get  

  77. {  

  78. returnm_Error;  

  79. }  

  80. }  

  81.  

  82. publicStringOutput  

  83. {  

  84. get  

  85. {  

  86. returnm_Output;  

  87. }  

  88. }  

  89.  

  90. publicboolHasError  

  91. {  

  92. get  

  93. {  

  94. returnm_Error!=""&&m_Error!=null;  

  95. }  

  96. }  

  97.  

  98. publicvoidRun(StringfileName,Stringpara)  

  99. {  

  100. StringBuilderoutputStr=newStringBuilder();  

  101.  

  102. try  

  103. {  

  104. //disabletheerrorreportdialog.  

  105. //reference:http://www.devcow.com/blogs/adnrg/archive/2006/07/14/
    Disable-Error-Reporting-Dialog-for-your-application-with-the-registry.aspx  

  106. Microsoft.Win32.RegistryKeykey;  

  107. key=Microsoft.Win32.Registry.LocalMachine.OpenSubKey
    (@"software\microsoft\PCHealth\ErrorReporting\",true);  

  108. intdoReport=(int)key.GetValue("DoReport");  

  109.  

  110. if(doReport!=0)  

  111. {  

  112. key.SetValue("DoReport",0);  

  113. }  

  114.  

  115. intshowUI=(int)key.GetValue("ShowUI");  

  116. if(showUI!=0)  

  117. {  

  118. key.SetValue("ShowUI",0);  

  119. }  

  120. }  

  121. catch  

  122. {  

  123. }  

  124.  

  125.  

  126. m_Error="";  

  127. m_Output="";  

  128. try  

  129. {  

  130. System.Diagnostics.Processp=newSystem.Diagnostics.Process();  

  131.  

  132. p.StartInfo.FileName=fileName;  

  133. p.StartInfo.Arguments=para;  

  134. p.StartInfo.UseShellExecute=false;  

  135. p.StartInfo.RedirectStandardInput=true;  

  136. p.StartInfo.RedirectStandardOutput=true;  

  137. p.StartInfo.RedirectStandardError=true;  

  138. p.StartInfo.CreateNoWindow=true;  

  139.  

  140. p.Start();  

  141.  

  142. ReadErrorThreadreadErrorThread=newReadErrorThread(p);  

  143.  

  144. while(!p.HasExited)  

  145. {  

  146. outputStr.Append(p.StandardOutput.ReadLine()+"\r\n");  

  147. }  

  148.  

  149. outputStr.Append(p.StandardOutput.ReadToEnd());  

  150.  

  151. while(!readErrorThread.HasExisted)  

  152. {  

  153. Thread.Sleep(1);  

  154. }  

  155.  

  156. m_Error=readErrorThread.Error;  

  157. m_Output=outputStr.ToString();  

  158. }  

  159. catch(Exceptione)  

  160. {  

  161. m_Error=e.Message;  

  162. }  

  163. }  

  164.  

  165. }  

  166. }  

以上就是C#中怎么調用外部進程,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洛宁县| 博兴县| 洛浦县| 区。| 正镶白旗| 海晏县| 娄底市| 朝阳县| 涞源县| 龙口市| 盘山县| 嘉鱼县| 汽车| 樟树市| 尼玛县| 宿州市| 神木县| 吉安市| 灵宝市| 米易县| 静宁县| 扎鲁特旗| 青冈县| 平湖市| 安达市| 洞头县| 辽源市| 辽宁省| 英吉沙县| 天柱县| 隆昌县| 原平市| 石泉县| 泉州市| 额敏县| 汶上县| 那曲县| 莱芜市| 凯里市| 巨野县| 汨罗市|