在C#Windows窗体应用程序的开发过程中,比如说要做成一个大的系统,集成很多其他应用的功能,可以利用现有的可运行的exe程序来丰富并完善系统。
首先进入到C:\Program Files (x86)\Tencent\QQ\Bin文件夹,在右侧空白处按住Shift键并点击鼠标右键,选择在此处打开命令行窗口后,用键盘输入QQ.exe按Enter键即可运行QQ程序,如下图所示。
打开Visual Studio 2015,新建C#->Windows窗体应用程序,项目名称输入InvokeQQ后确定,进入项目后会自动生成一个Form1窗体。
点开Form1窗体左侧的工具箱,将Button按钮拖入到Form1窗体中,然后在Button上右键选择属性,修改Button按钮的Text名称为启动外部QQ,并双击按钮进入按钮的点击触发事件函数button1_Click,在函数中输入三行代码来调用外部的QQ.exe程序,同时引入对应库,
using System.Diagnostics;//和其他的using放在一起 Process m_Process = new Process(); m_Process.StartInfo.FileName = "C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe";//QQ.exe所在的文件夹全路径 m_Process.Start();
然后点击上方的启动按钮运行项目,项目运行后会打开Form1窗体,用鼠标点击窗体中的按钮会弹出QQ应用,运行结果如下图所示。
打开Visual Studio 2015,新建Visual C+±>Win 32控制台应用程序,输入项目名称为WithParameterApp后点击确定,在弹出的窗口中附加选项选择空项目,生成项目后在右侧解决方案下WithParameterApp项目下的源文件上右键点击添加->新建项,选择C++文件,输入名称为main.cpp。将以下代码复制到main.cpp中后运行即可在对应文件夹中生成需传入参数WithParameterApp.exe程序,这个程序是用来求两个数的和,VS中运行后结果如下图所示(默认为1个参数)。
#include <iostream> using namespace std; /*** 将字符串转成int ***/ int char2int(const char* str) { const char* p = str; bool neg = false; int res = 0; if (*str == '-' || *str == '+') { str++; } while (*str != 0) { if (*str < '0' || *str > '9') { break; } res = res * 10 + *str - '0'; str++; } if (*p == '-') { res = -res; } return res; } void main(int argc, char *argv[]) { int cc=0; std::cout << "总共输入" << argc << "个参数" << endl; for(int i=0;i<argc;i++) std::cout << argv[i] << endl; if(argc ==3) std::cout << "两个数的和为" << char2int(argv[1]) + char2int(argv[2]) << endl; system("pause"); }
如上图所示,D:\Visual Studio 2015\MyProjects\WithParameterApp\Debug文件夹下已经生成了WithParameterApp.exe。
在D:\Visual Studio 2015\MyProjects\WithParameterApp\Debug文件夹下打开cmd窗口,输入以下命令后回车:WithParameterApp.exe 456 789
可以看到,运行结果中显示了456和789两个数的和为1245.
在上述项目名称为InvokeQQ的C# Windows窗体应用程序中在Form1窗体中再添加一个Button,Button的Text属性改为InvokeWithParameterApp,并双击该Button,在Button的Click事件函数中输入以下代码来进行外部exe的调用(传入参数),然后点击上方的运行绿色按钮,结果如下图所示。
Process cmd = new Process(); cmd.StartInfo.FileName = @"D:\Visual Studio 2015\MyProjects\WithParameterApp\Debug\WithParameterApp.exe"; cmd.StartInfo.WorkingDirectory = @"D:\Visual Studio 2015\MyProjects\WithParameterApp\Debug\"; cmd.StartInfo.CreateNoWindow = false;//显示命令行窗口 cmd.StartInfo.WindowStyle = ProcessWindowStyle.Normal; string param1 = "456", param2 = "789"; cmd.StartInfo.Arguments = param1+" "+param2; cmd.Start();
python.exe
algorithm123.py py脚本文件中注释也不要带中文最好,可有效避免编码解码错误
#-*- coding:utf-8 -*- import sys from os.path import exists print(sys.argv[1]) print(sys.argv[2]) from_name = sys.argv[1] to_name = sys.argv[2] source=open(from_name) indate=source.read() print(indate) source.close() target=open(to_name,'w') target.write(indate) target.close()
Win+R打开运行窗口,输入cmd打开命令行窗口后输入如下命令即可实现利用D:\Anaconda3\python.exe来执行E:\algorithm123\algorithm123.py脚本,然后将E:\异常\异常.txt文件复制到E:\algorithm123ExeResult\123456.txt。
D:\Anaconda3\python.exe E:\algorithm123\algorithm123.py E:\异常\异常.txt E:\algorithm123ExeResult\123456.txt
在上述项目名称为InvokeQQ的C# Windows窗体应用程序中在Form1窗体中再次添加一个Button,Button的Text属性改为Invokealgorithm123,并双击该Button,在Button的Click事件函数中输入以下代码来进行外部exe的调用(传入带不同路径的参数),然后点击上方的运行绿色按钮,结果如下图所示。
Process cmd = new Process(); cmd.StartInfo.FileName = @"D:\Anaconda3\python.exe";//必要时可将python环境设置到环境变量Path的最前面 cmd.StartInfo.UseShellExecute = false; //此处必须为false否则引发异常 cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardOutput = true; cmd.StartInfo.WorkingDirectory = "E:\\algorithm123\\"; cmd.StartInfo.CreateNoWindow = true;//不显示命令行窗口 cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; string path1 = "E:\\algorithm123\\algorithm123.py",path2= "E:\\异常\\异常.txt", path3= "E:\\algorithm123ExeResult\\12345678.txt"; cmd.StartInfo.Arguments = path1+" "+path2+" "+path3; cmd.Start(); //启动进程 MessageBox.Show("文件复制成功!");
首先可以利用conda新建一个虚拟环境conda create --name mypython python=3.6
,配置好清华镜像后就可以下载安装依赖包了,conda activate mypython
进入虚拟环境,然后pip list
查看已安装的包,由于py脚本文件可以通过pyinstaller来将现有的py文件打包为exe可执行程序。所以还要安装两个包pip install pyinstaller
和pip insatll requests
,安装好的包列表如下图所示。
下面利用Pyinstaller来将.py打包成exe,为了打包方便,我将虚拟环境里的python设置到了系统环境变量Path中,就是将D:\Anaconda3\envs\mypython和D:\Anaconda3\envs\mypython\Scripts放到了Path变量值得最前面,确定后再cmd中测试python和pip是否安装配置成功,如下图所示。
然后在algorithm123.py脚本文件所在的E:\algorithm123文件夹下打开cmd后,输入如下命令:pyinstaller -F algorithm23.py
,运行后提示打包成为exe成功,同时在文件夹下多了—pycache__、build和dist文件夹以及algorithm123.spec文件,其中在dist里有打包后的algorithm123.exe。
现在打开dist文件夹,并在此文件夹下打开cmd命令行窗口来测试打包后的algorithm123.exe能否运行成功,输入以下命令:algorithm123.exe E:\异常\异常.txt E:\algorithm123ExeResult\123456789exe.txt
,cmd窗口显示正确的执行结果,同时在E:\algorithm123ExeResult文件夹下也成功生成了123456789exe.txt文件,如下图所示。
在上述项目名称为InvokeQQ的C# Windows窗体应用程序中在Form1窗体中再次添加一个Button,Button的Text属性改为Invokealgorithm123.exe,并双击该Button,在Button的Click事件函数中输入以下代码来进行外部py脚本打包exe的调用(传入带不同路径的参数),然后点击上方的运行绿色按钮,运行结果如下图所示。
Process cmd = new Process(); cmd.StartInfo.FileName = @"E:\algorithm123\dist\algorithm123.exe"; cmd.StartInfo.UseShellExecute = false; //此处必须为false否则引发异常 cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardOutput = true; cmd.StartInfo.WorkingDirectory = "E:\\algorithm123\\dist\\"; cmd.StartInfo.CreateNoWindow = true;//不显示命令行窗口 cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; string path1 = "E:\\异常\\异常.txt", path2 = "E:\\algorithm123ExeResult\\123456exe.txt"; cmd.StartInfo.Arguments = path1 + " " + path2; cmd.Start(); MessageBox.Show("调用外部Python脚本打包exe执行文件复制成功!");