调用控制台程序的方法以及注意事项

我们常常用遇到调用第三方库,但是该库文件没有做好内存管理,会发生内存泄露的情况。

这个时候我们可以在控制台中调用该库,然后在代码中调用控制台程序,以此控制台的来管理内存。

public class ConsoleMethod
    {
        private static int _time = 10 * 60 * 1000;
        public static string InvokeConsole(string parameter, string programName, string programAddress = null)
        {
            Process cmd = new Process();
            cmd.StartInfo.FileName =programAddress+"\\"+programName;

            if (!string.IsNullOrEmpty(programAddress))
            {
                cmd.StartInfo.WorkingDirectory = programAddress;
            }

            //将cmd的标准输入和输出全部重定向到.NET的程序里
            cmd.StartInfo.UseShellExecute = false; //此处必须为false否则引发异常
            //cmd.StartInfo.RedirectStandardInput = true; //标准输入
            cmd.StartInfo.RedirectStandardOutput = true; //标准输出
            cmd.StartInfo.Arguments = parameter; //参数以空格分隔,如果某个参数为空,可以传入””

            //不显示命令行窗口界面
            cmd.StartInfo.CreateNoWindow = true;
            cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            cmd.Start(); //启动进程

            //获取输出
            //需要说明的:此处是指明开始获取,要获取的内容,
            //只有等进程退出后才能真正拿到
            StreamReader streamR = cmd.StandardOutput;
            string result = string.Empty;
            Task.Run(() =>  // 采用异步,读取调用控制台输出结果
            {
                result = cmd.StandardOutput.ReadToEnd();
            });
            bool res = cmd.WaitForExit(_time);//等待控制台程序执行完成
            if (!res)
            {
                cmd.Kill();
                cmd.Dispose();
                return result;
            }
            cmd.Close();//关闭该进程
            cmd.Dispose();//关闭该进程
            return result;
        }
    }
控制台应用,有两个地方需要注意:1.为防止 调用程序 crash 造成线程死锁,需要关闭 werfalut。如何禁用 werfault。2.为防止输出过大,造成死锁,需要采用异步

原文地址:https://www.cnblogs.com/yaolin1228/p/9063193.html

时间: 2024-10-09 22:14:01

调用控制台程序的方法以及注意事项的相关文章

热键调用三方程序 --- 实用方法

1. 问题或需求描述:热键调用三方程序 2.解决方法:使用 AutoIt3 脚本语言,可以快速编写出热键主调程序. 3.例如:利用热键调用三方程序,实现特定需要.例程中,我们实现按 "F4"键时调起三方程序,实现清除电脑上的所有蓝牙连接等功能. au3代码: If WinExists("firswof-clearbt") Then Exit GUICreate("firswof-clearbt") HotKeySet ( "{ESC}&

在C#中调用控制台程序

需求:  想在C#中调用一个带有参数 dos命令  whoami,并处理返回的文本信息 调查:  一查看 发现是个 .exe 的问件, 并且这个.exe可以根据不同的参数,得到不同的系统信息 解决方案:问度娘要了一点资料,度娘很爽快地答应了我,解决需求 参考的网页我放到了文章的末尾 关键代码: 新建了个窗体程序,代码在载入窗体的时候执行,只是个小demo,就不多说了 private void Form1_Load(object sender, EventArgs e)         { //实

利用管道获取控制台程序的标准输出

1.该程序调用控制台程序hello.exe,通过管道获取到hello.exe的标准输出数据,并打印到当前程序的标准输出. #include <Windows.h> #include <iostream> #include <string> using namespace std; void invoke(string exe); int main(int argc, char* argv[]) { string exe = "hello.exe";

C#1(.net和C#的关系、VS与.net的对应关系、VS2012常用的几种应用程序、C#定义一个类的方法、类页面内容的解释、定义Person的类、调用Person类的方法、命名规范、数值类型)

1..net和C#的关系 .net是一个开发平台,C#是应用在.net平台上的一种语言.   2.VS与.net的对应关系  3.VS2012常用的几种应用程序 第一种是Windows窗体应用程序,也即是我们常用的C/S端的应用软件: 第二种是控制台应用程序,主要是用来学习调试C#代码的(老师上课应用的模式): 第三种是空Web应用程序,建立空的网页模式,B/S模式: 第四种是Web 窗体应用程序,建立后会生成一些常用的网页组件和功能,例如JS.image等,也是B/S模式. 4.C#定义一个类

c# 调用c++DLL方法及注意事项

引用命名空间 using System.Runtime.InteropServices 调用方法: 一.静态加载 用DllImprot方式来加载c++DLL.如下格式: //对应c++方法 //void DogInit(WORD*,HWND) //错误返回值,窗口句柄 [DllImport("DOG.dll", EntryPoint = "DogInit", CallingConvention = CallingConvention.Cdecl)] public s

MAC COCOA call command 调用终端控制台程序

STEP 1 先写一个C++ DOS程序 STEP2 使用NSTask来执行,然后用NSPipe和 NSData来接受执行的结果字符串. 先写一个函数: /******************************* Function : NSTask Class + Terminal(=Windows Command) of MAC OS X Description : $ ./test_was_call_command_app -sum 2 8 5 ********************

vc6控制台程序利用SoapToolkit3.0调用WebService

1. 首先要安装SoapToolkit3.0安装包并安装(我的安装目录为:D:\Program Files\MSSOAP\) 2. 新建vc控制台程序(空项目),项目名称:WinConsole6InvokeWebService,添加一个c++源文件(main.cpp),将SOAP安装目录下的lib文件D:\Program Files\MSSOAP\Lib\mssoap30.lib复制到项目文件夹下. 3.添加源代码: #include <stdio.h> #include <iostre

Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法

Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我还是很操蛋的在QT下写控制台程序了,但是写完程序后运行时出现了如下情况. 程序运行了,但是控制台中居然只有一个光标在那儿跳啊跳.由于百度的姿势不对,废了好多时间,终于明白是因为qt creator不支持Gnome默认的终端gnome-terminal. 所以要换成XTerm的控制台. 具体的解决方式

[转]vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess

三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂.    WinExec 两个参数,前一个指定路径,后一个指定显示方式.    ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等.    Cr