小言_互联网的博客

C# 调用EXE文件 实现传参和获取返回结果

301人阅读  评论(0)

    在项目开发的过程中,不可避免的遇到这种情况:主程序由于算法的第三方库使用的目标平台需为X86的,但是在调用别家公司的程序或者是其他程序驱动不能为X86的(使用x64或者Any cup的没问题)。

    我遇到的连接oracle数据库报异常“尝试加载Oracle客户端库时引BadImageFormatException。如果在安装32位Oracle客户端组件的情况下以64位模式运行将出此问题”。这就不由的抱怨一句oracle数据库真的是事多呀,一大堆的问题。

    出现这种情况该怎么做呢,两边的平台要求是不一样的,不能修改。

        第一种方法:使用其他的不用区分目标平台的库进行连接;

        第二种方法:编写一个exe程序,其对接的操作都在这个程序中实现,并由主程序调用。

    下面我们就来说一下第二种方法的实现。

**************************************************************************************************************

1、新建一个“控制台应用程序”-- 在项目启动类文件Program中Main()函数中接收传递来的参数;代码如下:


  
  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. if(args.Length > 0 && ! string.IsNullOrEmpty(args[ 0]))
  6. {
  7. string num = args[ 0]; //获取传递过来的参数
  8. //DSCommuncationInfo 自定义的类;GetOracleData:连接Oracle数据库和获取数据函数
  9. DSCommuncationInfo info = GetOracleData(num);
  10. if (info != null)
  11. {
  12. //序列化成字符串数组
  13. string result = SerializedXMLHelper.Serializer(info);
  14. //将指定的字符串值(后跟当前行终止符)写入标准输出流。
  15. Console.WriteLine(result);
  16. }
  17. }
  18. }
  19. }

**************************************************************************************************************

2、主程序调用exe时,使用进程的方式把exe启动,调用代码如下:


  
  1. public void StartExternalProgram(string examinerNo)
  2. {
  3. //这里在dll程序中调用exe,路径是获取dll所在路径
  4. string exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
  5. string exeName = "CterHisExe.exe";
  6. string fileName = Path.Combine(exePath, exeName);
  7. //使用进程
  8. Process myProcess = new Process();
  9. myProcess.StartInfo.UseShellExecute = false;
  10. myProcess.StartInfo.RedirectStandardOutput = true;
  11. myProcess.StartInfo.FileName = fileName;
  12. myProcess.StartInfo.CreateNoWindow = true;
  13. //传参,参数以空格分隔,如果某个参数为空,可以传入“”
  14. myProcess.StartInfo.Arguments = examinerNo;
  15. p.StartInfo.WorkingDirectory = exePath; //设置要启动的进程的初始目录
  16. myProcess.Start(); //启动
  17. myProcess.WaitForExit( 15000); //等待exe程序处理完,超时15秒
  18. string xmldata = myProcess.StandardOutput.ReadToEnd(); //读取exe中内存流数据
  19. if (! string.IsNullOrEmpty(xmldata))
  20. {
  21. //自己实现的序列化
  22. var info = SerializedXMLHelper.Deserializer(xmldata);
  23. }
  24. }

    虽然这种方法比较复杂,但是也是解决平台不兼容的可行方法之一。

**************************************************************************************************************

    Process.Start()无法启动exe程序的问题:

    1、可能是参数不是绝对路径,exe的路径地址不正确。

    2、如果在外部直接运行exe程序没有问题,而当这个程序中有配置文件,或在启动的时候需要读取其他文件时,需要设置StartInfo的WorkingDirectory属性为应用程序的目录。

    在此做个笔记和分享,如果大家有好的方法方案,欢迎在下方留言评论交流。

**************************************************************************************************************


转载:https://blog.csdn.net/BYH371256/article/details/126314868
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场