c#制作外部调用exe,接收返回数据的问题。

only_youlix 2019-08-16 10:02:28
需求是制作一个可以传参的exe,在exe中处理 之后 返回处理结果(json数据)。

制作的exe是用wpf做的。 exe中有两套方法 一个是有异步回调的(或者加了thread),一个就没有这些 。如果用重定向输出到控制台再读取的话。 有异步的 就读取不到。没有异步的就可以正常输出 读取。相关输出代码

Console.Write(JsonConvert.SerializeObject(zfbFace.Result));
//Environment.Exit(0);

调用exe代码

Process p = new Process();
p.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = strExePath;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();
string str = p.StandardOutput.ReadToEnd();


然后用win32进程通信改了一下,不使用重定向这种。但是通过被调用exe 写入给调用窗体的时候 需要给Process启动的时候 设置一个属性
p.ProcessorAffinity = IntPtr.Zero; 否则界面窗体就卡住了。测试调用exe也是wpf做的。好像和ui线程没关系。有没有大神能解惑啊
...全文
626 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
only_youlix 2019-08-16
  • 打赏
  • 举报
回复
引用 2 楼 X-i-n 的回复:
wpf不方便读输出结果。直接用redis、消息队列会省很多事。

没研究过redis.就用过mqtt..我研究一下 咋回事~
only_youlix 2019-08-16
  • 打赏
  • 举报
回复
引用 4 楼 wanghui0380 的回复:
没有碰到你说的情况,无法确定。

所以不能做什么评论,只能说,那就干脆点,他们的通讯使用标准通讯“比如命名管道,比如tcp,比如rpc”

tcp那些的话 人家不用 现在就是 我做一个exe把微信支付宝的刷脸放在一起。通过传参区分调用,然后返回刷脸结果。
比较恶心的是 管道输出 微信的好着,支付宝的有回调,输出不过来。。吧Process那些个参数研究了一下 加了个ProcessorAffinity 设置 直接窗体通信就好了。 给到客户 他们就是想 我需要刷脸 就启动你的exe,完成拿到json, exe关闭 就完事了。他们肯定不会再额外弄个tcp通信去接收这个。
zetee 2019-08-16
  • 打赏
  • 举报
回复
https://www.cnblogs.com/lanshy/p/4441450.html
多进程共享内存做法,看一下咯
wanghui0380 2019-08-16
  • 打赏
  • 举报
回复
至于ProcessorAffinity这个,按照你描述的,我只能认为,可能他的任务比较重,使用的并行代码,然后如果取消并行,他的并发处理慢了,所以卡了
wanghui0380 2019-08-16
  • 打赏
  • 举报
回复
没有碰到你说的情况,无法确定。 所以不能做什么评论,只能说,那就干脆点,他们的通讯使用标准通讯“比如命名管道,比如tcp,比如rpc”
only_youlix 2019-08-16
  • 打赏
  • 举报
回复
引用 1 楼 github_36000833 的回复:
外部exe的作用是处理数据,用WPF不是太合适。
外部exe中,用线程处理数据也不还合适,因为还是要等待数据处理完毕exe才能退出。

外部exe用控制台程序作比较合适。

这个我也清楚。。因为还想在没有参数的时候 有个测试界面。而且那个exe中不止有我写的处理代码,还需要调用外部的 摄像头处理服务。人家那个服务里面有异步方法(两套摄像头,一个有异步,一个没有) 我自己方法里面线程什么的都去掉了。 现在改成win32通信之后 调用什么的都没问题。就是那个 设置CPU的那个不是很理解了。。
X-i-n 2019-08-16
  • 打赏
  • 举报
回复
wpf不方便读输出结果。直接用redis、消息队列会省很多事。
github_36000833 2019-08-16
  • 打赏
  • 举报
回复
外部exe的作用是处理数据,用WPF不是太合适。
外部exe中,用线程处理数据也不还合适,因为还是要等待数据处理完毕exe才能退出。

外部exe用控制台程序作比较合适。
江湖评谈 2019-08-16
  • 打赏
  • 举报
回复
供其它应用程序调用不应该是,DLL吗? EXE 理论上来说,并不适合进程进程共享
only_youlix 2019-08-16
  • 打赏
  • 举报
回复
引用 9 楼 XBodhi. 的回复:
你需要什么功能,跨进程,还是直接 给 exe 传参数。如果传参数直接 argment 设置下就可以了。

功能就是 我制作一个exe供其他程序调用 这个exe可以接收参数,然后内部调用其他exe(摄像头操作,他们的exe中有线程,异步回调),经过处理之后 返回一个json给调用的程序。现在做是做完了。用的是process启动进程 ,然后通过sendmessage函数进行的消息传递。不知道有没有啥其他方法。像通信协议 udp那些就不考虑了。
XBodhi. 2019-08-16
  • 打赏
  • 举报
回复
你需要什么功能,跨进程,还是直接 给 exe 传参数。如果传参数直接 argment 设置下就可以了。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧