现在有一个需求,要批量转换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只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人!
