服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#调用EXE文件实现传参和获取返回结果

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

2023-02-28 13:47^@^lemon tea^@^ C#

本文主要介绍了C#调用EXE文件实现传参和获取返回结果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

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

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

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

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

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

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

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

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

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

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

1、可能是参数不是绝对路径,exe的路径地址不正确。
2、如果在外部直接运行exe程序没有问题,而当这个程序中有配置文件,或在启动的时候需要读取其他文件时,需要设置StartInfo的WorkingDirectory属性为应用程序的目录。

到此这篇关于C#调用EXE文件实现传参和获取返回结果的文章就介绍到这了,更多相关C#调用EXE文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/BYH371256/article/details/126314868

延伸 · 阅读

精彩推荐
  • C#c# NPOI 如何在指定单元格导入导出图片

    c# NPOI 如何在指定单元格导入导出图片

    这篇文章主要介绍了c# NPOI 如何在指定单元格导入导出图片,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    WeihanLi10992022-11-03
  • C#C# WPF Image控件的绑定方法

    C# WPF Image控件的绑定方法

    这篇文章主要介绍了C# WPF Image控件的绑定方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    Hello——寻梦者!5812022-11-03
  • C#C#读取XML的CDATA节点内容实例详解

    C#读取XML的CDATA节点内容实例详解

    在本篇文章里小编给大家整理了关于C# 读取XML的CDATA节点内容的相关知识点内容,有需要的朋友们参考学习下。...

    需要充电8752022-08-05
  • C#C#请求唯一性校验支持高并发的实现方法

    C#请求唯一性校验支持高并发的实现方法

    这篇文章主要给大家介绍了关于C#请求唯一性校验支持高并发的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价...

    龙腾-hyl12062022-08-07
  • C#Unity OnGUI实时显示游戏FPS

    Unity OnGUI实时显示游戏FPS

    这篇文章主要为大家详细介绍了Unity OnGUI实时显示游戏FPS,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Czhenya5082022-08-08
  • C#C# winform程序实现开机自启动并且识别是开机启动还是双击启动

    C# winform程序实现开机自启动并且识别是开机启动还是双击启动

    这篇文章主要介绍了C# winform程序实现开机自启动并且识别是开机启动还是双击启动的实现代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要...

    碧水青荷6362022-03-03
  • C#C#实现Winform小数字键盘模拟器

    C#实现Winform小数字键盘模拟器

    本文主要介绍了C#实现Winform小数字键盘模拟器,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    中洲少年7612022-12-08
  • C#C# 装箱和拆箱的知识回顾

    C# 装箱和拆箱的知识回顾

    本篇文章主要介绍了C#的装箱和拆箱的知识点回顾,对大家的学习和复习具有很好的参考价值,需要的朋友一起来看下吧...

    反骨仔12252021-12-15