python 动态加载C# 动态库的一些问题
python导入C#动态库问题
背景介绍
我使用的python是3.7,需要调用之前已经用于其他项目的C#编写的动态库(xx.dll).由于调用方法很简单,可以参考下这个调用动态库,这里主要说一下我遇到的问题。
试图加载格式不正确的程序
这个问题实际是由于目标程序和调用的dll不处于相同的编码上,我的目标python使用的是64位编译,而调用的程序采用的是32位编译,这就导致调用出错。可以参考这个详解Python 调用C# dll库最简方法中的2来改变动态库的编码。
引入clr,却无法使用FindAssembly等函数
有一个clr包,但是python调用clr包却是从pythonnet里面的模块,所以下载时候一定要下载对了。但是我自动安装的时候,发现clr成功import了,但是里面不包含常用的findAssembly等函数。之后发现大多的说明的是2.5左右的版本,而我的安装包是3.1的,于是没办法只能退回去,按装了指定的版本2.5.1的了。问题给解决了。
动态加载dll库
我的项目要求尽可能兼容其他不同语言编写的dll,所以我这里就使用了反射来加载C#动态库。首先,python程序指定位置(我用的是xml文件)配置上需要加载的dll路径,然后python程序启动的时候就根据配置文件指定的路径一个个加载dll。这就导致python在import的时候不知道import哪个模块(只知道模块的名字),于是我就各种找如何动态引入。最后发现使用exec执行命令的方式完美解决。具体方式如下:
sys.path.append(os.getcwd() + "\\static\\dll")if ".dll" in dllPath:backRec = dllPath.index(".dll")tempModuleName = dllPath[0:backRec]clr.FindAssembly("static/dll/" + tempModuleName)else:clr.FindAssembly("static/dll/" + dllPath)clr.AddReference(tempModuleName)execcmd = "from %s import %s,%s" % (nameSpace, classname, InitClassName)exec(execcmd)
反射模块(inspect)使用问题
导入模块之后,需要根据配置文件中具体的方法名称,类名称来获取对应的方法和类。所以使用inspect这个模块,inspect可以通过getmembers来获取具体的属性。然后根据名字找到对应的方法和类。具体代码可以参考如下:
for key, obj in inspect.getmembers(sys.modules[nameSpace]):if key == classname:curParseClass = objbreak
curParseClass就是名字位classname的类,然后就可以用其进行初始化对象并调用类成员函数,或者直接调用静态函数或者对象。但是这里我碰到一个问题就是inspect.getmembers获取对象属性时有时会失败,失败的原因是,调用的C#动态库定义的类中有个属性由枚举转化得到的字符串,即私有属性_deviceType为string,公有属性DeviceType为枚举对象,get返回时,使用名称获取对应的枚举返回。但是_deviceType的默认值为空,而其枚举里并没有这个属性,就会导致inspect.getmembers将DeviceType转化为string时出现了无法转化的情况。
相关文章:
python 动态加载C# 动态库的一些问题
python导入C#动态库问题 背景介绍 我使用的python是3.7,需要调用之前已经用于其他项目的C#编写的动态库(xx.dll).由于调用方法很简单,可以参考下这个调用动态库,这里主要说一下我遇到的问题。 试图加载格式不正确的程序 这个问题实际是由于目标程序和…...
代码审计-锐捷NBR路由器 EWEB网管系统 远程命令执行
那天下着很大的雨,母亲从城里走回来的时候,浑身就是一个泥人,那一刻我就知道我没有别的选择了 出现漏洞的文件在 /guest_auth/guestIsUp.php 审查源码我们发现通过命令拼接的方式构造命令执行 构造payload: /guest_auth/guestI…...
VBA技术资料MF75:测量所选单元格范围的高度和宽度
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...
力扣 26. 删除有序数组中的重复项
目录 1.解题思路2.代码实现 1.解题思路 由于数组为非严格递增排列的数组,因此可利用快慢指针,如果快指针减一不等于快指针,将快指针的值给慢指针,并将快慢指针同时加一,但如果相同,则只让快指针加一向后走…...
【uniapp】仿微信支付界面
效果图 完整代码 <template><view class="my-pay-page"><view :style=...
windows + ubuntu + vscode开发环境配置安装
一、卸载WSL/WSL2 如果安装了windows子系统的朋友,可以选择继续使用。或者提前卸载WSL,再选择安装虚拟机。虚拟机占用内存较大,WSL可能对于开发的一些需求还有欠缺。根据自己的实际情况进行选择。 WIN10/11安装WSL(请参考官方资料,…...
设计模式:责任链模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)
上一篇《享元模式》 下一篇《解释器模式》 简介: 责任链模式,它是一种行为型设计模式,它将许多对象连接起来形成一条链,每个对象处理不同的请求,…...
koa搭建服务器(二)
在上一篇文章已经成功的运行了一个http服务器,接下来就是使用Sequelize ORM(官方文档:Sequelize 简介 | Sequelize中文文档 | Sequelize中文网)来操作数据库。 1、安装依赖 首先也是需要安装相关的依赖 npm i sequelize npm i …...
LeetCode 125 验证回文串 简单
题目 - 点击直达 1. 125 验证回文串 简单1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 125 验证回文串 简单 1. 题目详情 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反…...
Android底层摸索改BUG(一):Android系统状态栏显示不下Wifi图标
这是我入职的第一个BUG,头疼,隔壁实习生一周解决了,我多花了几天 其中最大的原因就是我思考复杂了,在公司系统上,此BUG标题为: 请确认Wifi优先级,状态栏Wifi被忽略 BUG意思就是:当…...
第十三章---枚举类型与泛型
一,枚举类型 1.使用枚举类型设置常量 设置常量时,我们通常将常量放置在接口中,这样在程序中就可以直接使用。该常量稚因为在接口中定义常量时,该常量的修饰符为 final 与 static。 public interface Constants ( public static …...
shell语法大全(超级详细!!!!),非常适合入门
本文旨在对y总的Linux基础课shell语法做学习记录,指令较多,方便日后查找。 参考视频:Linux基础课 参考教程:Linux教程 1 概论 Linux中常见的shell脚本有很多种,常见的有: Bourne Shell(/usr/bin/sh或/bi…...
【Python机器学习】零基础掌握ExtraTreesRegressor集成学习
面临的问题:如何更准确地预测糖尿病患者的病情? 在医疗领域,准确预测疾病的发展状况是至关重要的。尤其是对于糖尿病这样的慢性病,一个精准的预测模型能帮助医生制定更有效的治疗方案。但问题是,如何构建一个高准确度的预测模型呢? 假设现有一组糖尿病患者的医疗数据,…...
网络协议--TCP的交互数据流
19.1 引言 前一章我们介绍了TCP连接的建立与释放,现在来介绍使用TCP进行数据传输的有关问题。 一些有关TCP通信量的研究如[Caceres et al. 1991]发现,如果按照分组数量计算,约有一半的TCP报文段包含成块数据(如FTP、电子邮件和U…...
IOC课程整理-13 Spring校验
1. Spring 校验使用场景 2. Validator 接口设计 3. Errors 接口设计 4. Errors 文案来源 5. 自定义 Validator 6. Validator 的救赎 7. 面试题精选 Spring 校验接口是哪个 org.springframework.validation.Validator Spring 有哪些校验核心组件?...
SSM咖啡点餐管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
一、源码特点 SSM 咖啡点餐管理系统是一套完善的信息系统,结合SSM框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主 要采用B/S模式开…...
Capacitor 打包 h5 到 Android 应用,uniapp https http net::ERR_CLEARTEXT_NOT_PERMITTED
Capacitor 打包 h5 到 Android 应用,uniapp https http net::ERR_CLEARTEXT_NOT_PERMITTED capacitor 官网: https://capacitorjs.com/docs/ 项目上需要做一个 app,而这个 app 是用 uniapp 做的,里面用到了一个依赖 dom 的库&…...
华为数通方向HCIP-DataCom H12-831题库(多选题:101-120)
第101题 LSR对收到的标签进行保留,且保留方式有多种,那么以下关于LDP标签保留一自由方式的说法 A、保留邻居发送来的所有标签 B、需要更多的内存和标签空间 C、只保留来自下一跳邻居的标签,丢弃所有非下一跳铃邻居发来的标签 D、节省内存和标签空间 E、当IP路由收敛、下一跳…...
misc学习(4)Traffic(流量分析)-
感悟:回想起自己学的计算机网络和网络协议分析,有所感悟:计算机网络好比将一群人区分开来(局域网),为了能够使得不同部分的人能够沟通(wireshark中的数据包),就设置了网络…...
Less的基本语法
less的每一个语句后必须使用";"结束,否则可能无法正确的转换成css 1、导入 即在当前less文件中引用其它less文件,被引入的less文件中的内容可以在此less文件中使用。在引用less文件时可以省略扩展名 import "global"; // global.…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
