前言

使用C#调用外部程序,一种是通过Process类,一种是通过命令行,本文主要说一下使用C#中的Process类调用外部程序的方式。

过程:

1. 创建Process对象
2. 配置启动选项(输入、输出等)
3. 切换工作目录
4. 设置外部程序名
5. 设置传入参数
6. 启动外部程序
7. 等待外部程序结束
8. 关闭外部程序

过程

创建Process对象

Process process = new Process();
//通过new创建一个Process对象 process
//使用Process类需要在程序最开始处引用Process类所在命名空间,即下面这句
using System.Diagnostics;

配置启动选项

process.StartInfo.UseShellExecute = false; //必要参数
process.StartInfo.RedirectStandardOutput = true;//输出参数设定
process.StartInfo.RedirectStandardInput = true;//传入参数设定
process.StartInfo.CreateNoWindow = true;

切换工作目录

  1. 工作目录:程序运行时其启动文件以及配置文件等文件的所在目录。比如在桌面上选中QQ,右键单击“打开文件所在位置”,这个目录就是QQ运行起来后的工作目录。

     我们当前编写的C#程序运行后也有自己的工作目录,因此如果要在C#中调用外部程序,最好在调用前将当前工作目录切换为外部程序的工作目录。
  2. 查看当前工作目录

以下两种代码都可以打印出当前程序的工作目录

  • System.IO.Directory.GetCurrentDirectory();

该函数以sting类型返回当前工作目录,可以使用控制台打印当前工作目录。

Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
//打印一下工作目录
  • AppDomain.CurrentDomain.BaseDirectory;

AppDomain:应用程序域,以上语句可以获取当前应用程序域的基目录,也就是 应用程序名.exe所在目录,一般这个目录也是默认的工作目录。

AppDomain.CurrentDomain.BaseDirectory;是sting类型,因此也可以使用控制台打印出来。

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);

这两种方法打印工作目录的区别在于:

第一种方法打印的是工作目录,是动态的(工作目录可更改)

第二种方法打印的是当前AppDomain的基目录,只要AppDomain没被更改,打印出来的始终是 当前AppDomain的基目录,也就是应用程序名.exe所在目录

因此,可以在启动外部程序前更改工作目录为外部程序的工作目录,在外部程序执行结束后再使用AppDomain.CurrentDomain.BaseDirectory;将工作目录恢复为原始基目录以保证后续程序的正常执行。

  1. 切换当前工作目录为外部程序工作目录
System.IO.Directory.SetCurrentDirectory (外部程序工作目录);
//外部程序工作目录以字符串形式给出,且必须是绝对路径

比如当前C#所在程序的路径为 C:/Deskop/C#/bin/Debug/

AppDomain.CurrentDomain.BaseDirectory就等于C:/Deskop/C#/bin/Debug/
(当前工作目录也是这个路径)

所调用的外部程序目录在 C:/Deskop/C#/bin/Debug/NASM/

nasm.exe在C:/Deskop/C#/bin/Debug/NASM/nasm.exe

这里就可以写成

System.IO.Directory.SetCurrentDirectory ("C:\\Deskop\\C#\\bin\\Debug\\NASM\\");
//直接给出绝对路径
//路径分隔用 \ 转义 (即\\)
System.IO.Directory.SetCurrentDirectory (AppDomain.CurrentDomain.BaseDirectory + "\\NASM");
//或者使用基目录给出绝对路径
System.IO.Directory.SetCurrentDirectory(System.IO.Directory.GetCurrentDirectory() + "\\NASM");
//或者根据当前工作目录设置
  1. 恢复原始工作目录

在外部程序执行结束后需要将工作目录切换回来,借助AppDomain.CurrentDomain.BaseDirectory

System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

设置外部程序名

切换工作目录后,一般外部程序名就在新的目录目录下。

process.StartInfo.FileName = "nasm.exe";
//等价于"C:\\Deskop\\C#\\bin\\Debug\\NASM\\nasm.exe"

设置传入参数

光有程序不行,还需要指定让这个程序执行什么操作,这个操作就通过传入参数传递。

比如在nasm下要将其工作目录下的MySourcesCode目录下的demo02.asm编译链接生成4.obj文件(生成在MySourcesCode目录下),就需要打开nasm,输入如下命令

nasm MySourcesCode/demo02.asm -o MySourcesCode/4.obj

nasm是程序名,后面的就是nasm的传入参数,也就是我们需要设置的东西。

process.StartInfo.Arguments = "MySourcesCode\\demo02.asm -o MySourcesCode\\4.obj ";

程序启动、等待执行、关闭

process.Start();
process.WaitForExit();//等待程序执行完退出进程
process.Close();

完整代码

Process process = new Process();
process.StartInfo.UseShellExecute = false; //必要参数
process.StartInfo.RedirectStandardOutput = true;//输出参数设定
process.StartInfo.RedirectStandardInput = true;//传入参数设定
process.StartInfo.CreateNoWindow = true; System.IO.Directory.SetCurrentDirectory (AppDomain.CurrentDomain.BaseDirectory + "\\NASM");
//设置NASM工作目录为当前工作目录 //Console.WriteLine(System.IO.Directory.GetCurrentDirectory()); //打印一下工作目录 process.StartInfo.FileName = "nasm.exe";
//设置要打开的程序名 process.StartInfo.Arguments = "MySourcesCode\\demo02.asm -o MySourcesCode\\4.obj ";
//设置传入参数 process.Start(); //程序启动
process.WaitForExit();//等待程序执行完退出进程
process.Close(); //关闭程序 System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
//NASM执行完后需要将工作目录切换为原工作目录 //Console.WriteLine(System.IO.Directory.GetCurrentDirectory()); //打印一下工作目录

环境及运行截图

外部程序

外部程序所在目录

外部程序源文件_目标文件所在目录

C#调用外部程序后生成的目标文件

C#Process调用外部程序的更多相关文章

  1. C# 使用Process调用外部程序中所遇到的参数问题

    在使用Process.Start 调用外部程序时,除了程序的地址之外,是可以传递参数的,Process.Start 也有多个重载: // // 摘要: // 启动由包含进程启动信息(例如,要启动的进程 ...

  2. C#使用Process类调用外部程序(转)

    在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能.它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程.一.启动进程实例 Process myProc ...

  3. C#winform调用外部程序,等待外部程序执行完毕才执行下面代码

    1.简单调用外部程序文件(exe文件,批处理等),只需下面一行代码即可 System.Diagnostics.Process.Start(“应用程序文件全路径”); 2.如果要等待调用外部程序执行完毕 ...

  4. QProcess调用外部程序方式的差异

    众所周知QProcess类的作用是启动一个外部的程序并与之交互它有三种方式调用外部程序: 1. execute 2. start 3. startDetached 从调用上看: execute是阻塞调 ...

  5. PowerShell中调用外部程序和进程操作命令例子

    学习PowerShell,我们不指望通过C#编程去搞定所有事情,我们应该记住cmd.exe或者说批处理给我们留下的宝贵财富——通过调用外部程序去解决问题.调用了外部程序,势必就要对进程进行管理,这就是 ...

  6. C# 客户端程序调用外部程序的三种实现

    简介 我们用C#来开发客户端程序的时候,总会不可避免的需要调用外部程序或者访问网站,本篇博客介绍了三种调用外部应用的方法,供参考 实现 第一种是利用shell32.dll,实现ShellExecute ...

  7. [C#]做服务使用Process启动外部程序没窗体

    这几天会到一个需要,要时时侦测文件生成,并上传到Server上,侦测文件生成使用的FileSystemWatch.但是时时运行遇到了问题,程序可能会人为退出或者意外终止,使用一个进程监控程序的监程,也 ...

  8. JAVA中调用外部程序,并等待其退出(涉及Runtime和ProcessBuilder)

    这段时间要写一个java调用外部程序的功能,踩了几个坑,这里分享一下. 首先用的是RunTime,调用代码如下: Process pro = Runtime.getRuntime().exec(&qu ...

  9. Java魔法堂:调用外部程序

    前言 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程.那能不能通 ...

随机推荐

  1. sql语句查询,limit与order by 同时出现,应该order by在前面

    eg:select orderid,status,createtime from orders where appid = :appId and userid = :userId order by c ...

  2. Modbus java slave app

    文章实现 Modbus slave app , 用 serial rtu 传输, 代码只实现监听功能(本人测试可行), 要实现写功能,可研究一下代码中 updateProcessImage 方法.完整 ...

  3. VMware虚拟机安装黑群晖DSM6.2 (转)

    安装DSM6.2.和安装5.1的过程大致相同,只是在虚拟机的配置时有所不同. 需要用到的工具 Roadkil's Disk Image – 写镜像工具:http://www.roadkil.net/p ...

  4. 杭电OJ----1097:一个难题(c++)

    问题描述 lcy给feng5166,lwg,JGShining和Ignatius带来了一个难题:给了a和b,如何知道a ^ b.每个人都反对这个BT问题,所以lcy使问题比开始容易. 这个难题描述了: ...

  5. 基于Python的接口自动化-读写excel文件

    引言 使用python进行接口测试时常常需要接口用例测试数据.断言接口功能.验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据写在脚本文件中,这样写出来整个接口测试用例脚本代码将看起来 ...

  6. Java内存模型与线程(二)线程的实现和线程的调度

    先行先发生原则(happen-before原则) 先行先发生是指Java内存模型中定义的两项操作之间的偏序关系. 如果说A先行于B,其实就是说在发生B操作之前,操作A产生的影响能被操作B观察到,至于这 ...

  7. 十三:SQL注入之MYSQL注入

    MYSQL注入中首先要明确当前注入点权限,高权限注入时有更多的攻击手法,有的能直接进行getshell操作,其中也会遇到很多的阻碍,相关防御手法也要明确,所谓知己知彼,百战不殆.作为安全开发工作者,攻 ...

  8. /usr/local/mysql/bin/mysqlbinlog -vv /var/lib/bin/mysql-bin.000008 --base64-output=DECODE-ROWS --start-pos=307

    /usr/local/mysql/bin/mysqlbinlog -vv /var/lib/bin/mysql-bin.000008 --base64-output=DECODE-ROWS  --st ...

  9. kubernets之pod的标签

    一     如何查看pod 的日志 1 通过执行命令查看日志信息 kubectl logs pod_name 二    创建带有标签的pod,一个范例的pod创建yaml文件如下所示 2.1 创建带有 ...

  10. 入门OJ:售货员的难题

    题目描述 某乡有n个村庄(1<n<15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率 ...