知识大全 一个C#写的调用外部进程类

Posted

篇首语:知不足而奋进,望远山而力行。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 一个C#写的调用外部进程类相关的知识,希望对你有一定的参考价值。

一个C#写的调用外部进程类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    C# 调用外部进程的类 网上可以搜出很多来 为什么要再写一遍 实在是因为最近从网上拷贝了一个简单的例程用到项目中 运行有问题 后来研究了半天 才解决了这些问题 于是打算写这么一篇博文 一来说说调用一个外部进程这么简单的一件事究竟会有哪些问题 二来也希望我写的这个相对比较完整的类可以为软件开发的同道们节约一些脑细胞 以便集中优势兵力解决那些真正高深复杂的软件问题     在开始正题之前 我们先来看一看网上比较常见的执行外部进程的函数

 

private string RunCmd(string mand)            //例Process        Process p = new Process();

        p StartInfo FileName = cmd exe ;           //确定程序名        p StartInfo Arguments = /c + mand;    //确定程式命令行        p StartInfo UseShellExecute = false;        //Shell的使用        p StartInfo RedirectStandardInput = true;   //重定向输入        p StartInfo RedirectStandardOutput = true;  //重定向输出        p StartInfo RedirectStandardError = true;   //重定向输出错误        p StartInfo CreateNoWindow = true;          //设置置不显示窗口        p Start();   //         //p StandardInput WriteLine(mand);       //也可以用这种方式输入命令        //p StandardInput WriteLine( exit );        //要得加上Exit        return p StandardOutput ReadToEnd();        //输出出流取得命令行结果

   

    这个方法应该是比较常见的调用外部进程的方法 我以前也一直是这样调用外部进程的 也没有碰到过什么问题 但这次调用的外部进程比较特殊 用这种方法调用就出现了两个问题

    第一个问题是这个被调用的外部进程有时候会出现异常 出现异常后Windows会弹出错误报告框 程序于是吊死在那里 必须手工干预 这个问题比较好解决 程序中设置一下注册表搞定

    第二个问题是调用这个外部进程(是一个控制台进程)后 程序会阻塞在p StandardOutput ReadToEnd() 这一句 永远无法出来 被调用的那个控制台程序也被吊死 但该控制台进程在CMD 中是可以正常执行的 后来看来一些资料才发现原来原因是出在该控制台程序控制台输出大量字符串 管道重定向后 调用程序没有及时将管道中的输出数据取出 结果导致管道被阻塞 程序吊死 在这里还有另外一个问题 虽然这次没有遇到 但网上有其他人遇到 就是错误信息管道不及时取出数据 也会被阻塞 而且如果要同时取出两个管道的数据 必须要利用一个辅助线程才能实现

    问题讲完了 下面给出这个类的完整代码

    using System;    using System Collections Generic;    using System Text;    using System Runtime InteropServices;    using System Threading;    namespace Laboratory Process        class ReadErrorThread            System Threading Thread m_Thread;        System Diagnostics Process m_Process;        String m_Error;        bool m_HasExisted;        object m_LockObj = new object();        public String Error                    get                            return m_Error;                            public bool HasExisted                    get                            lock (m_LockObj)                                    return m_HasExisted;                           

            set                            lock (m_LockObj)                                    m_HasExisted = value;                                            private void ReadError()                    StringBuilder strError = new StringBuilder();            while (!m_Process HasExited)                            strError Append(m_Process StandardError ReadLine());                        strError Append(m_Process StandardError ReadToEnd());

            m_Error = strError ToString();            HasExisted = true;                public ReadErrorThread(System Diagnostics Process p)                    HasExisted = false;            m_Error = ;            m_Process = p;            m_Thread = new Thread(new ThreadStart(ReadError));            m_Thread Start();       

        class RunProcess            private String m_Error;        private String m_Output;        public String Error                    get                            return m_Error;                            public String Output                    get                            return m_Output;                            public bool HasError                    get                            return m_Error != && m_Error != null;                            public void Run(String fileName String para)                    StringBuilder outputStr = new StringBuilder();

            try                            //disable the error report dialog                 //reference: // devcow /blogs/adnrg/archive/ / / /Disable Error Reporting Dialog for your application with the registry aspx                Microsoft Win RegistryKey key;                key = Microsoft Win Registry LocalMachine OpenSubKey(@ sofare\\microsoft\\PCHealth\\ErrorReporting\\ true);                int doReport = (int)key GetValue( DoReport );                if (doReport != )                                    key SetValue( DoReport );                                int showUI = (int)key GetValue( ShowUI );                if (showUI != )                                    key SetValue( ShowUI );                                        catch                                    m_Error = ;            m_Output = ;            try                            System Diagnostics Process p = new System Diagnostics Process();                p StartInfo FileName = fileName;                p StartInfo Arguments = para;                p StartInfo UseShellExecute = false;                p StartInfo RedirectStandardInput = true;                p StartInfo RedirectStandardOutput = true;                p StartInfo RedirectStandardError = true;                p StartInfo CreateNoWindow = true;                p Start();                ReadErrorThread readErrorThread = new ReadErrorThread(p);

                while (!p HasExited)                                    outputStr Append(p StandardOutput ReadLine()+ \\r\\n );                                outputStr Append(p StandardOutput ReadToEnd());                while (!readErrorThread HasExisted)                                    Thread Sleep( );                                m_Error = readErrorThread Error;                m_Output = outputStr ToString();                        catch (Exception e)                            m_Error = e Message;                   

cha138/Article/program/net/201311/15678

相关参考

知识大全 C#程序调用外部程序

C#程序调用外部程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  /*  * 编程语言Visu

知识大全 java里面如何创建一个内部类的实例?

  要想使用new生成一个内部类的实例需要先指向一个外部类的实例也就是先生成外部类的实例因为内部类可以调用外部类的人员成员当没有外部类实例的时候也就没有这些成员的内存空间内部类在实例化的时候调用外部类

知识大全 用反射调用任意.net库中的方法

注:ReturnMessage是我自写的一个类作用请查看我的其他文章我也把这个类一并附在后面通过NameSpaceAndClassName和MethodName实际上就可以精确定位一个方法了如调用ab

知识大全 asp调用c#编制的com组件实例

 新建类库MyTestDLL  右击项目“MyTestDLL”》属性》生成》勾选“为互操作注册”  打开 AssemblyInfocs&nb

知识大全 asp调用C#编写的DLL发送邮件

asp调用C#编写的DLL发送邮件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一直想写一个a

知识大全 列出C#进程以及详细信息

列出C#进程以及详细信息  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!建立一个listBox将进程

知识大全 C#委托的同步调用和异步调用

C#委托的同步调用和异步调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对于C#委托我们谈的

知识大全 C#传值调用与引用调用

C#传值调用与引用调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  usingSystem; 

知识大全 C#调用WebService示例

C#调用WebService示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#调用WebS

知识大全 C#定时调用方法(线程)

C#定时调用方法(线程)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  //这些是C#线程的思路