• C#通过C++操作共享内存和Python通讯[C#调用exe不显示窗口]


    C#通过C++操作共享内存和Python通讯

    现在有一个需求,要批量转换png图片为bmp24位深度的图片,C#目前能够做到的是把png转成bmp,但是对位深度确没有办法,这时候查到Python有办法很容易做到,说这里萌生了C#调用Python的办法,经过连接没有办法实现Python打包成dll然后给C#调用.没办法,最后使用了共享内存和Python通讯,间接操作Python实现自己想要的功能.这里介绍怎么把这套平台搭建起来!
    之所以不用直接调用Python的exe在Python的exe中转换图片是因为我之前已经实现一个功能非常多的C#工具了,不想再新建一个工具的历史原因!

    Python端代码

    首先新建一个Python工程,启动运行:
    在这里插入图片描述
    Python运行成功后先会读取共享内存的内容,看到标志后就会去等待命令,如下:
    在这里插入图片描述
    在这里插入图片描述

    如果收到执行获取版本号的命令执行如下函数:
    在这里插入图片描述
    这时候C#这边就会来读取共享内存,如果收到共享内存的版本号就说明Python有响应了!

    C#端代码

    因为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#调用exe不显示窗口

    这里还要做一个补充,我们发布的时候希望C#在调用Python的时候不显示Python的窗口,这时候代码做如下的设置:
    本文摘录于:https://blog.csdn.net/yugui/article/details/111723066只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人!
    在这里插入图片描述

  • 相关阅读:
    供给侧结构性改革语境应对世界市场 国稻种芯百团计划行动
    A-Level经济例题解析及练习Analysis of Tax
    毫米波传感器原理介绍:测速_1相位
    《中国蓝色金融发展:现状及挑战》报告正式发布
    浅梳理JS对字符串的操作
    自动调用构造方法
    【c++】虚函数和虚函数表(多态)
    阿桂天山的技术小结:Sqlalchemy+pyodbc连接MSSQL server测试
    tvm在linux环境下的安装与编译及vscode如何配置tvm的远程连接调试环境
    卡码网语言基础课 |出现频率最高的字母
  • 原文地址:https://blog.csdn.net/chengdong1314/article/details/126917120