![C#通过C++ *** 作共享内存和Python通讯[C#调用exe不显示窗口],第1张 C#通过C++ *** 作共享内存和Python通讯[C#调用exe不显示窗口],第1张](/aiimages/C%23%E9%80%9A%E8%BF%87C%2B%2B%E6%93%8D%E4%BD%9C%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98%E5%92%8CPython%E9%80%9A%E8%AE%AF%5BC%23%E8%B0%83%E7%94%A8exe%E4%B8%8D%E6%98%BE%E7%A4%BA%E7%AA%97%E5%8F%A3%5D.png)
现在有一个需求,要批量转换png图片为bmp24位深度的图片,C#目前能够做到的是把png转成bmp,但是对位深度确没有办法,这时候查到Python有办法很容易做到,说这里萌生了C#调用Python的办法,经过连接没有办法实现Python打包成dll然后给C#调用.没办法,最后使用了共享内存和Python通讯,间接 *** 作Python实现自己想要的功能.这里介绍怎么把这套平台搭建起来!
之所以不用直接调用Python的exe在Python的exe中转换图片是因为我之前已经实现一个功能非常多的C#工具了,不想再新建一个工具的历史原因!
首先新建一个Python工程,启动运行:
Python运行成功后先会读取共享内存的内容,看到标志后就会去等待命令,如下:
如果收到执行获取版本号的命令执行如下函数:
这时候C#这边就会来读取共享内存,如果收到共享内存的版本号就说明Python有响应了!
因为C#对于内存的 *** 作并不是很方便,所以这里使用C++来 *** 作内存,然后封装成DLL给C#使用,这里代码启动的时候调用Python_Creat函数创建共享内存:
然后调用Python的exe:
因为Python程序启动有比较长的时间,所以这里创建一个1S定时器,5S后来调用Python_Open函数来查看共享内存时候正常也代表Python是否成功运行:
Python_Open函数代码如下:
调试有两种方案,一个是在C#中注释掉启动exe的语句并且在Python_Open调用之前打断线,只要在执行Python_Open函数前启动Python代码就可以了,也就是说这种方法是可以进行Python的调试的:
1.启动CAL并且到Python_Open函数前:
2.运行Python程序:
可以看到Python已经可以正确识别到共享内存了
3.接下来运行Python_Open函数,这个函数会读取Python的程序版本号:
上面的方法好处是可以在pycharm中仿真调试
仿真调试的方法也是有不好的地方,就是必须要启动pycharm,对于需要大量调试或者临时看bug的情况不是很好,这里增加上打印调试,放开对于启动exe的启动语句并且不用打断点:
启动C#软件可看到Python打印如下:
Python_Open函数执行后打印如下:
本文到这里就结束了! 这里上传本文所用的资料:https://mp.csdn.net/mp_download/manage/download/UpDetailed
这里还要做一个补充,我们发布的时候希望C#在调用Python的时候不显示Python的窗口,这时候代码做如下的设置:
本文摘录于:https://blog.csdn.net/yugui/article/details/111723066只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)