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

news2024/11/16 15:37:32

在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 importlib


if __name__ == '__main__':
    dllName='ClassLibrary1.dll'
    namespace='ClassLibrary1'
    className='TestCsharp'
    methodName1='test1'
    methodName2 = 'test2'
    # paramsType=''
    paramsVal1=1
    paramsVal2 = 2

    #工作目录设置dll所在目录
    sys.path.append(os.getcwd())
    #找到c#程序集
    clr.FindAssembly(dllName)
    #设置命名空间参考【设置模块】
    dll=clr.AddReference(namespace)
    # print(dll)

    #从指定命名空间导入类
    # from ClassLibrary1 import TestCsharp

    module_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.coloradmin.cn/o/1688328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

话题:如何让大模型变得更聪明?

随着人工智能(AI)技术的迅速发展,大模型(如GPT-4、BERT、Transformer等)在自然语言处理、图像识别和语音识别等领域取得了显著成果。然而,如何让大模型变得更聪明,进一步提升其性能和应用效果&a…

Softing工业推出新品edgeGate:一款用于工业边缘和云应用的硬件网关

2024年4月17日(哈尔),Softing工业自动化在2024年汉诺威工业博览会上首次展示了新品edgeGate。该产品是一个无需维护的硬件物联网网关解决方案,可将生产数据从PLC和数控机床控制器传输至工业边缘及物联网云平台。 (edge…

重学java 38.创建线程的方式⭐

It is during our darkest moments that we must focus to see the light —— 24.5.24 一、第一种方式_继承extends Thread方法 1.定义一个类,继承Thread 2.重写run方法,在run方法中设置线程任务(所谓的线程任务指的是此线程要干的具体的事儿,具体执行的代码) 3.创建自定义线程…

光伏企业都在用的户用光伏管理软件——鹧鸪云

随着全球对可再生能源和清洁能源的需求日益增长,光伏产业作为其中的佼佼者,正迎来前所未有的发展机遇。然而,随着光伏电站规模的扩大和分布范围的增加,如何高效、智能地管理这些电站,确保它们稳定、安全地运行&#xf…

做好商业分析,帮你用有限的资源选择高效益项目实现战略目标

对于组织来说,资源条件总是有限的,为了实现战略目标,则需要从众多项目中筛选出最合适的项目来实现收益。但项目的筛选往往会遇到很多难点,如信息收集不全影响筛选的准确性、评估标准不明确或难以量化、决策过程复杂等等。 那么如何…

【NumPy】关于numpy.reshape()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

java如何获取IP和IP的归属地?

在Java中,获取IP地址通常指的是获取本地机器的IP地址或者通过某种方式(如HTTP请求)获取的远程IP地址。代码案例如下: 而要获取IP的归属地(地理位置信息),则通常需要使用第三方IP地址查询服务,我…

【JAVA |再谈接口、Object、内部类】Object类中子类重写,Cloneable 接口、比较器、内部类

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 🎈丠丠64-CSDN博客🎈 ✨✨ 帅哥美女们,我们共同加油!一起…

element-plus:踩坑日记

el-table Q:有fixed属性时,无数据时,可能出现底部边框消失的bug 现象: 解决方法: .el-table__empty-block {border-bottom: 1px solid var(--el-table-border-color); } el-collapse 折叠面板 Q:标题上…

Java操作Word文档,根据模板生成文件

Java操作Word文档 poi-tl介绍 官方文档:https://deepoove.com/poi-tl/ poi-tl(poi template language)是Word模板引擎,使用模板和数据创建很棒的Word文档。 在文档的任何地方做任何事情(Do Anything Anywhere&#…

在全志H616核桃派开发板上配置I2C引脚并读取温度数据

配置引脚 找到板子上的i2c引脚 为了方便查找,我们加入了一个显示功能引脚位置的功能,运行以下命令,查看板子的40pin引脚上有几个可用i2c gpio pin i2c启用i2c 我们使用set-device指令来使能/关闭指定设备的底层驱动,使能后&am…

视频汇聚/云存储/安防监控EasyCVR接入GB28181设备未回复ack信息的原因排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。 用户反馈,设备通过国标GB28181注…

Docker 容器间通讯

1、虚拟ip/访问 同一网络 安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间(包括宿主机)可以根据分配的ip互相访问(ps:其他主机(包括其他主机的容器)无法ping通docker容器ip无法访问&#…

RepOptimizer原理与代码解析(ICLR 2023)

paper:Re-parameterizing Your Optimizers rather than Architectures offcial implementation:https://github.com/dingxiaoh/repoptimizers 背景 神经网络的结构设计是将先验知识融入模型中。例如将特征转换建模成残差相加的形式(\(yf(x…

Zoho CRM怎么样?云衔科技为企业提供采购优惠!

企业对于客户关系管理(CRM)系统的需求日益增加,Zoho CRM作为一款备受赞誉的国际CRM服务提供商,凭借其全面的功能、出色的用户体验和卓越的性价比,成为了众多企业数字化转型的得力助手。 Zoho CRM是一款覆盖客户全生命…

Vue状态管理深度剖析:Vuex vs Pinia —— 从原理到实践的全面对比

🔥 个人主页:空白诗 文章目录 👋 引言📌 Vuex 基础知识核心构成要素示例代码 📌 Pinia 基础知识核心构成要素示例代码 📌 Vuex与Pinia的区别📌 使用示例与对比📌 总结 👋…

Transormer(2)-位置编码

位置编码公式 偶数位置用sin,奇数位置用cos. d_model 表示token的维度;pos表示token在序列中的位置;i表示每个token编码的第i个位置,属于[0,d_model)。 torch实现 import math import torch from torch import nn from torch.autograd im…

Vue 3 的 setup语法糖工作原理

前言 我们每天写vue3项目的时候都会使用setup语法糖,但是你有没有思考过下面几个问题。setup语法糖经过编译后是什么样子的?为什么在setup顶层定义的变量可以在template中可以直接使用?为什么import一个组件后就可以直接使用,无需…

【如何让论文中摘要后面的内容不出现在目录中】

首先选择摘要二字,设置为一级标题,然后选择摘要后面的内容设置为正文样式,再选择这一部分看一下是不是都是正文大纲级别,如果是那就可以了。 具体流程如下 1、选择摘要二字,设置为一级标题样式 2、选择摘要后面的文…

FreeRTOS学习——FreeRTOS队列(下)之队列创建

本篇文章记录我学习FreeRTOS队列创建的知识。主要分享队列创建需要使用的初始化函数、队列复位函数。 需要进一步了解FreeRTOS队列的相关知识,读者可以参考以下文章: FreeRTOS学习——FreeRTOS队列(上)_freertos 单元素队列-CSDN博…