• C#Process调用外部程序


    前言

    使用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()); //打印一下工作目录
    

    环境及运行截图

    外部程序

    外部程序.jpg

    外部程序所在目录

    外部程序所在目录.jpg

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

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

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

    C_调用外部程序后生成的目标文件.jpg

  • 相关阅读:
    springboot整合springmvc应用
    spring注解使用
    亨元模式 四大引用 逃逸引用 池化思想
    springboot整合连接池
    springboot整合mybatis(待更新)
    php安装imagick扩展
    js复制功能代码
    PHP7兼容mysql_connect的方法
    linux开机启动
    centos8安装php扩展memcached报错
  • 原文地址:https://www.cnblogs.com/GuoYuying/p/14355185.html
Copyright © 2020-2023  润新知