亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

闽侯县| 屏边| 延庆县| 遵化市| 衡阳县| 道真| 台北县| 涞源县| 玛沁县| 吴桥县| 顺义区| 衡东县| 墨脱县| 东乌珠穆沁旗| 嘉峪关市| 宜都市| 名山县| 泗洪县| 临颍县| 防城港市| 灵璧县| 莱州市| 鹤山市| 庆城县| 荃湾区| 本溪| 西城区| 天津市| 镇江市| 陈巴尔虎旗| 张家港市| 东辽县| 景泰县| 武汉市| 岳西县| 手游| 荔浦县| 连云港市| 明星| 汕头市| 土默特右旗|