当前位置: 首页 > news >正文

Python中动态调用C#的dll动态链接库中方法

在Python中调用C#的dll库_哔哩哔哩_bilibili 

环境准备: 

安装 pythonnet

pip install pythonnet

 在Python中调用C#动态链接库(DLL),可以使用pythonnet库,它允许直接使用 .NET 的程序集。以下是一个示例,展示如何使用pythonnet调用C#动态链接库中的方法。

【pythonnet详解】—— Python 和 .NET 互操作的库-CSDN博客

 注意事项

在pycharm中写import clr,若根据提示安装clr模块,在调用C#的dll动态连接库时会报错module 'clr' has no attribute 'AddReference' ·建议pip uninstall clr,安装pythonnet模块

module 'clr' has no attribute 'AddReference' · Issue #319 · r0x0r/pywebview · GitHub

C#中调用dll动态链接库

案例1:

在Python中调用C#的dll库_哔哩哔哩_bilibili

C# 代码

python 代码

 

案例2: 

C#代码

假设有一个C#动态链接库MyLibrary.dll,其中有一个类MyClass,包含一个方法MyMethod,该方法接收两个整数参数并返回它们的和。

// MyLibrary.cs
namespace MyLibrary
{public class MyClass{public int MyMethod(int a, int b){return a + b;}}
}
Python代码 
import clr  # 导入pythonnet# 添加DLL引用
clr.AddReference(r'C:\path\to\MyLibrary.dll')# 导入命名空间
from MyLibrary import MyClass# 创建类的实例
my_instance = MyClass()# 调用方法
result = my_instance.MyMethod(3, 5)print(f"The result is: {result}")

C#中动态调用dll动态链接库的方法 

需求:已知方法名称、参数个数和参数类型,在python中调用c#动态链接库

C#中与Python中类型的对应

在使用 pythonnet 调用 C# 动态链接库中的方法时,Python 和 C# 的参数类型需要相互对应。以下是常见的类型映射

 

  • 对于复杂对象,确保已导入相应的命名空间(如 System.Collections.Generic)。
  • 在 Python 中使用 List, Dictionary 等 C# 泛型类型时,需要指定类型参数。

案例1:

 C#代码

假设有一个C#动态链接库MyLibrary.dll,其中有一个类MyClass,包含一个方法MyMethod,该方法接收两个整数参数并返回它们的和。

// MyLibrary.cs
namespace MyLibrary
{public class MyClass{public int MyMethod(int a, int b){return a + b;}}
}
Python代码 

核心:获取非静态方法

  • method = getattr(my_instance, method_name),利用getattr(par1,par2)方法

        //参数1为类的实例,参数2为方法名称

import clr
import System# 添加DLL引用
clr.AddReference(r'C:\path\to\MyLibrary.dll')# 导入命名空间
from MyLibrary import MyClass# 创建类的实例
my_instance = MyClass()# 动态调用方法
method_name = "MyMethod"
params = (3, 5)# 获取方法
method = getattr(my_instance, method_name)# 调用方法
result = method(*params)print(f"The result is: {result}")

案例2:

 C#代码:

假设有一个C#动态链接库ClassLibrary1.dll,其中有一个类TestCsharp,包含一个静态方法方法test2()和一个非静态方法test1().

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ClassLibrary1
{public class TestCsharp{//private string name;//带参构造函数//public TestCsharp(string name) {//    this.name = name;//}// 无参构造函数public TestCsharp() { }public int test1(int times) { return times;}//静态方法public static int test2(int times) {Console.WriteLine(times);return times;}}
}
Python代码:

1.利用importlib和getattr()动态导入模块和类

  •     module_1 = importlib.import_module(namespace)//动态获取模块
  •     class_1 = getattr(module_1,  className)//动态获取类

2.利用getattr()方法动态获取静态方法和非静态方法

  •         method1 = getattr(my_instance,methodName1)//非静态方法
  •         method2 = getattr(class_1 ,methodName2)//静态方法
import os
import sys
import clr
import importlibif __name__ == '__main__':dllName='ClassLibrary1.dll'namespace='ClassLibrary1'className='TestCsharp'methodName1='test1'methodName2 = 'test2'# paramsType=''paramsVal1=1paramsVal2 = 2#工作目录设置dll所在目录sys.path.append(os.getcwd())#找到c#程序集clr.FindAssembly(dllName)#设置命名空间参考【设置模块】dll=clr.AddReference(namespace)# print(dll)#从指定命名空间导入类# from ClassLibrary1 import TestCsharpmodule_1 = importlib.import_module(namespace)class_1 = getattr(module_1,  className)#实例化,非静态方法my_instance = class_1()# 获取方法method1 = getattr(my_instance,methodName1)#调用非静态方法print(method1(paramsVal1))method2 = getattr(class_1 ,methodName2)#调用静态方法print(method2(paramsVal2))

附加:

importlib

是 Python 标准库中的一个模块,用于动态导入模块。它提供了一系列函数和类,允许你在运行时加载和操作模块。以下是 importlib 的详细介绍,包括常见用法和示例。

基本概念

importlib 模块实现了 import 语句背后的导入机制。它提供了更为灵活和动态的方式来导入模块,允许你在运行时根据需要加载和操作模块,而不仅仅是在编译时或脚本开始时导入模块。

使用 importlib.import_module() 可以动态地导入模块

import importlib# 导入一个模块
module_name = 'math'
math_module = importlib.import_module(module_name)# 使用导入的模块
result = math_module.sqrt(16)
print(result)  # 输出: 4.0

importlib 是 Python 中强大且灵活的模块导入机制。它提供了动态导入、模块重载、自定义导入逻辑和其他高级功能,使得模块管理更加灵活和强大。通过理解和使用 importlib,你可以更好地控制 Python 程序中的模块导入和管理。

getattr

是 Python 的一个内置函数,用于从对象中获取属性值。它接受一个对象、属性名(字符串形式)和一个可选的默认值作为参数。如果指定的属性存在,则返回该属性的值;如果属性不存在且提供了默认值,则返回默认值;如果属性不存在且没有提供默认值,则引发 AttributeError 异常。

Python函数介绍:getattr函数的用法和示例-Python教程-PHP中文网

相关文章推荐:Java调用C++的DLL设计!!!解耦实用!!!-CSDN博客

相关文章:

  • node环境问题(无法加载文件D:\Software\Node.js\node_global\vue.ps1,因为在此系统上禁止运行脚本。)
  • 必应bing国内广告开户首充和开户费是多少?
  • 来盘点我的校园生活(4)
  • 计划跳槽需要做哪些准备?
  • Spring Boot 实现 RabbitMQ 监听消息的几种方式
  • 系统架构师考试(十)
  • 爱设计AiPPT.cn赵充:营销工作的AI进化
  • Android Settings系统属性读写
  • Linux(openEuler22.03) 定时备份任务 解决方案
  • LIO-EKF: High Frequency LiDAR-Inertial Odometry using Extended Kalman Filters
  • 【大数据面试题】32 Flink 怎么重复读 Kafka?
  • SpringBoot自动装配原理是什么?
  • 互联网医院开发:引领智慧医疗新时代
  • Mac安装配置maven
  • KDE-Ambari-Metrics-Collector问题排查解决手册
  • 【React系列】如何构建React应用程序
  • 【知识碎片】第三方登录弹窗效果
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Angular 响应式表单 基础例子
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Github访问慢解决办法
  • javascript数组去重/查找/插入/删除
  • js面向对象
  • Object.assign方法不能实现深复制
  • PAT A1120
  • Redash本地开发环境搭建
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 基于HAProxy的高性能缓存服务器nuster
  • 精彩代码 vue.js
  • 以太坊客户端Geth命令参数详解
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​补​充​经​纬​恒​润​一​面​
  • ​马来语翻译中文去哪比较好?
  • ​人工智能书单(数学基础篇)
  • "无招胜有招"nbsp;史上最全的互…
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #QT(QCharts绘制曲线)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (52)只出现一次的数字III
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (pytorch进阶之路)扩散概率模型
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (十八)三元表达式和列表解析
  • (十五)使用Nexus创建Maven私服
  • (五)activiti-modeler 编辑器初步优化
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)http-server应用
  • (转)scrum常见工具列表
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)用.Net的File控件上传文件的解决方案