【C#】C#Process调用外部程序
创始人
2024-05-13 21:43:12
0

前言

使用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#中调用外部程序,最好在调用前将当前工作目录切换为外部程序的工作目录。

  1. 查看当前工作目录
    以下两种代码都可以打印出当前程序的工作目录
  • 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#调用外部程序后生成的目标文件
在这里插入图片描述

相关内容

热门资讯

有你真好的作文(通用6篇) 有你真好的作文 篇一有你真好每个人的生活中都会有那么一个重要的人,他们的存在让我们的生活变得更加美好...
我上学了(优选3篇) 我上学了 篇一我上学了已经有好几年了,回想起来,这段时光仿佛就在眨眼间过去了。刚开始上学的时候,我还...
有趣的游戏小学作文400字【... 有趣的游戏小学作文400字 篇一标题:童年乐园——躲猫猫游戏在我心中,有一个让我欢乐无比的游戏,那就...
那次玩得真高兴作文(优秀5篇... 那次玩得真高兴作文 篇一那次玩得真高兴上个周末,我和我的朋友们一起去了游乐园玩,那次真是玩得太高兴了...
初一七年级学生作文题目【优选... 初一七年级学生作文题目 篇一我的暑假计划暑假即将来临,我对未来的两个月充满了期待和计划。今年的暑假,...
假如考上了名校,我要回来看看... 假如考上了名校,我要回来看看我的母校小学作文 篇一当我考上了名校,我内心感到无比的兴奋和自豪。这是我...
校园桂花香小学作文【最新3篇... 校园桂花香小学作文 篇一校园桂花香小学作文我所在的学校是一所名为桂花香小学的学校,这个名字来源于学校...
春天小学一年级作文300字(... 春天小学一年级作文300字 篇一春天的花儿春天是一个美丽的季节,大地万物都在春天苏醒,充满了生机和活...
小学中秋节的作文【优选3篇】 小学中秋节的作文 篇一中秋节是中国传统的节日之一,也是我最喜欢的节日。在这一天,我和家人一起庆祝,品...
梦里清江小学作文【优质3篇】 梦里清江小学作文 篇一我爱梦里清江小学梦里清江小学是我上学的地方,它位于美丽的梦里清江边。每当我踏进...
难忘的秋游小学作文450字(... 难忘的秋游小学作文450字 篇一难忘的秋游今天,我们全班去郊游了,这是我度过的一个最难忘的秋天。我们...
可怜的骆驼作文(优质3篇) 可怜的骆驼作文 篇一骆驼是一种生活在沙漠中的动物,它们背上长着一座座驼峰,可以存储大量的水分,帮助它...
倔老头作文【优选3篇】 倔老头作文 篇一倔老头的坚持倔老头是我家附近的一位老先生,他已经七十多岁了,但他的身体和精神状态一直...
小学生一年级的作文400字(... 小学生一年级的作文400字 篇一我的暑假计划暑假就要来了,我有很多计划,让我来给大家说说吧!首先,我...
师爱温暖我的心小学作文【优秀... 师爱温暖我的心小学作文 篇一师爱温暖我的心作为一名小学生,我有幸遇到了一位非常特别的老师,她就是我的...
可爱的金毛小学作文【优秀3篇... 可爱的金毛小学作文 篇一我家的金毛小狗我家有一只可爱的金毛小狗,它的名字叫做小黄。小黄是一只非常聪明...
四年级上册三单元作文【优秀3... 四年级上册三单元作文 篇一我的家乡我是一个四年级的学生,我想给大家介绍一下我的家乡。我的家乡是一个美...
约定的作文【优秀3篇】 约定的作文 篇一约定的作文可以是一种非常有趣的写作形式,它让人们可以事先约定一个共同的主题或要求,然...
山不过来我就过去作文【优秀3... 山不过来我就过去作文 篇一山不过来我就过去小时候,我曾听过这样一个故事:有一位终身未婚的老人,住在山...
游趵突泉【精选3篇】 游趵突泉 篇一:探寻自然奇迹的乐园趵突泉,位于中国山东省济南市市中心,是中国历史最为悠久的泉眼之一。...