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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/330664.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 写的_string类,兼容std::string, MFC CString和 C# 的string

代码例子: using namespace lf; int main() { CString s1 _t("http://www.csdn.net"); _string s2 s1; CString s3 s2; _pcn(s1); _pcn(s2); _pcn(s3); return 0; } 输出: _Str.h /***************************************…

在使用LabVIEW控制多个串口设备进行数据读取时,读取时间过长

在使用LabVIEW控制多个串口设备进行数据读取时,如果发现数据更新时间超过5秒,可以从以下几个方面进行分析和解决: 1. 串口配置与通信参数 确保每个串口的通信参数(波特率、数据位、停止位、校验位等)配置正确&#x…

【数据结构】二叉树的功能实现

文章目录 关于二叉树的创建如何创建二叉树实现二叉树的前、中、后序遍历层序遍历 关于二叉树的创建 在笔者的上一篇文章中堆进行了一个详细介绍,而二叉树是以堆为基础进行创建,它与堆的显著不同是 堆像是一个线性结构,堆的结构往往是一个数…

springboot项目,@Test写法 @Before @After

某文件示例 package cn.xxx.crm.boss;import cn.xxxx.crm.manager.mq.rabbit.AliyunCredentialsProvider; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; im…

2024电工杯数学建模B题Python代码+结果表数据教学

2024电工杯B题保姆级分析完整思路代码数据教学 B题题目:大学生平衡膳食食谱的优化设计及评价 以下仅展示部分,完整版看文末的文章 import pandas as pd df1 pd.read_excel(附件1:1名男大学生的一日食谱.xlsx) df1# 获取所有工作表名称 e…

XSS漏洞:pikachu靶场中的XSS通关

目录 1、反射型XSS(get) 2、反射性XSS(POST) 3、存储型XSS 4、DOM型XSS 5、DOM型XSS-X 6、XSS之盲打 7、XSS之过滤 8、XSS之htmlspecialchars 9、XSS之href输出 10、XSS之js输出 最近在学习XSS漏洞,这里使用…

与WAF的“相爱相杀”的RASP

用什么来保护Web应用的安全? 猜想大部分安全从业者都会回答:“WAF(Web Application Firewall,应用程序防火墙)。”不过RASP(Runtime Application Self-Protection,应用运行时自我保护)横空出世…

LeetCode198:打家劫舍

题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存…

【LeetCode】【5】最长回文子串

文章目录 [toc]题目描述样例输入输出与解释样例1样例2 提示Python实现动态规划 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给一个字符串s,找到s中最长的回文子串 样例输入输出与解释 样例1 输入…

打造专业级网页排版:全方位解析专业字体家族font-family实践与全球知名字体库导览

CSS中的字体家族(font-family)属性用于指定文本所使用的字体系列。它允许开发者选择一种或多种字体作为备选,确保在浏览器中以最佳可用字体显示文本。本文将深度解析专业级网页排版中字体家族(font-family)设置的实践技…

嵌入式实时操作系统笔记2:UCOS基础知识_UC/OS-III移植(STM32F4)_编写简单的UC/OS-III任务例程(失败.....)

今日学习嵌入式实时操作系统RTOS:UC/OS-III实时操作系统 本文只是个人学习笔记备忘用,附图、描述等 部分都是对网上资料的整合...... 文章主要研究如何将UC/OS-III 移植到 STM32 F407VET6上,提供测试工程下载 (2024.5.21 文章未…

明天(周六)下午!武汉Linux爱好者线下沙龙,我们在华中科技大学等你!

2024 年 5月 25 日(周六)下午,我们将在「武汉市洪山区」 珞喻路 1037 号华中科技大学南五楼 613 室举办武汉 Linux 爱好者线下沙龙(WHLUG),欢迎广大 Linux 爱好者来到现场,与我们一同交流技术&a…

【Spring】SSM介绍_SSM整合

1、SSM介绍 1.1简介 SSM(Spring SpringMVC MyBatis)整合是一种流行的Java Web应用程序框架组合,它将Spring框架的核心特性、SpringMVC作为Web层框架和MyBatis作为数据访问层框架结合在一起。这种整合方式提供了从数据访问到业务逻辑处理再…

构建智能化的语言培训教育技术架构:挑战与机遇

随着全球化的发展和人们对语言学习需求的增长,语言培训教育行业正面临着越来越多的挑战和机遇。在这个背景下,构建智能化的语言培训教育技术架构成为提升服务质量和效率的重要手段。本文将探讨语言培训教育行业的技术架构设计与实践。 一、智能化教学平台…

接口响应断言

目录 接口断言介绍接口断言方式介绍响应状态码断言 课程目标 掌握什么是接口断言。了解接口断言的多种方式。掌握如何对响应状态码完成断言。 思考 这两段代码是完整的接口自动化测试代码吗? …省略… when().get(“https://httpbin.ceshiren.com/get?namead&…

Golang | Leetcode Golang题解之第109题有序链表转换二叉搜索树

题目: 题解: var globalHead *ListNodefunc sortedListToBST(head *ListNode) *TreeNode {globalHead headlength : getLength(head)return buildTree(0, length - 1) }func getLength(head *ListNode) int {ret : 0for ; head ! nil; head head.Next…

AI视频智能分析技术赋能营业厅:智慧化管理与效率新突破

一、方案背景 随着信息技术的快速发展,图像和视频分析技术已广泛应用于各行各业,特别是在营业厅场景中,该技术能够有效提升服务质量、优化客户体验,并提高安全保障水平。TSINGSEE青犀智慧营业厅视频管理方案旨在探讨视频监控和视…

爬虫基础1

一、爬虫的基本概念 1.什么是爬虫? 请求网站并提取数据的自动化程序 2.爬虫的分类 2.1 通用爬虫(大而全) 功能强大,采集面广,通常用于搜索引擎:百度,360,谷歌 2.2 聚焦爬虫&#x…

Linux 如何用上次的checkpoint文件dist_train.sh 接着训练【mmdetection】

在Linux环境下,如果你想要用上一次的checkpoint文件继续训练,你可以在你的dist_train.sh脚本中设置--resume_from参数。这个参数指定了checkpoint文件的路径,训练会从该文件的状态继续进行。 例如,如果你的checkpoint文件名为las…

LAMDA面试准备(2024-05-23)

有没有学习过机器学习,提问了 FP-Growth 相比 Apriori 的优点 1. 更高的效率和更少的计算量(时间) FP-Growth 通过构建和遍历 FP-树 (Frequent Pattern Tree) 来挖掘频繁项集,而不需要像 Apriori 那样生成和测试大量的候选项集。具…