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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1+x(Java)中级题库易混淆理论题

<ALL表示小于最小 小于最高等同于小于ANY 使用USING子句&#xff0c;在使用连接字段时&#xff0c;都不能在前面加上表的前缀&#xff0c;因为此时这个字段已经是连接字段&#xff0c;不再属于某个单独的表。 数据库提供的自动将提供的数据类型数据转换为期望的数据类…

go select 原理

编译器会使用如下的流程处理 select 语句&#xff1a; 将所有的 case 转换成包含 channel 以及类型等信息的 runtime.scase 结构体。调用运行时函数 runtime.selectgo 从多个准备就绪的 channel 中选择一个可执行的 runtime.scase 结构体。通过 for 循环生成一组 if 语句&…

AIGC:AI整活!万物皆可建筑设计

在过去的一年里 AI设计爆火 各行业纷纷将之用于工作中 同时不少网友也在借助它整活 万物皆可设计 甲方骂我方案像屎一样 于是我就回馈他屎一样的方案 他有点惊喜&#xff0c;但是没话 不是吧&#xff0c;随便找了个充电头图片 也能生成建筑设计&#xff01;这都能行 鸟…

人工智能应用-实验7-胶囊网络分类minst手写数据集

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;代码&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;分析结果&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;实验总结&#x1f9e1;&#x1f9e1; &#x1f9…

微信小程序的自定义组件

一、创建自定义组件 &#xff08;1&#xff09;定义&#xff1a; 把页面重复的代码部分封装成为一个自定义组件&#xff0c;以便在不同的页面中重复使用&#xff0c;有助于代码的维护。 &#xff08;2&#xff09;组成&#xff1a; 自定义组件的组成&#xff1a;json文件&a…

Flutter 中如何优雅地使用弹框

日常开发中&#xff0c;Flutter 弹框&#xff08;Dialog&#xff09;是我们使用频率非常高的控件。无论是提示用户信息、确认用户操作&#xff0c;还是表单填写&#xff0c;弹框都能派上用场。然而&#xff0c;看似简单的弹框&#xff0c;实际使用起来却有不少坑和使用的技巧。…

el-select可选择可搜索可输入新内容

需求&#xff1a;el-form-item添加el-select&#xff0c;并且el-select可选择可搜索可输入新内容&#xff0c;并且和其他的el-input做联动&#xff0c;如果是选择&#xff0c;那么el-input自动回填数据并且不可编辑&#xff0c;如果el-select输入新的内容&#xff0c;那么el-in…

webpack5 splitChunks分割代码

首先明确webpack 自身的打包行为 当splitChunks为false时&#xff0c;此时不启用任何打包设置 可以看到&#xff0c;静态引入全都打到一个chunk里&#xff0c;动态引入会拆分出来一个chunk,这是纯webpack无配置的打包&#xff0c; webpack会给每个模块打上标记 ,如下 { m…

【HCIP学习】RSTP和MSTP

一、RSTP&#xff08;Rapid Spanning Tree Protocol&#xff0c;快速生成树&#xff09; 1、背景&#xff1a;RSTP从STP发展而来&#xff0c;具备STP的所有功能&#xff0c;可以兼容stp运行 2、RSTP与STP不同点 &#xff08;1&#xff09;减少端口状态 STP:disabled\blockin…

抵御风险——漫谈运维核心价值和方法论

要明晰什么是运维的核心价值&#xff0c;也就是要弄明白&#xff0c;从整个软件行业运维的角色定位来看&#xff0c;运维的核心价值在哪里&#xff1f;怎样增强自己实现核心价值的能力的问题。 软件产业本质其实还是工业&#xff0c;它的产品和传统的工业产品形态虽然有巨大差…

汇舟问卷:海外问卷调查如何闭坑?

大家好&#xff0c;我是汇舟问卷。有很多人问我这行有什么骗局吗&#xff1f;怎么说呢&#xff1f;其实每个行业都是真实存在的&#xff0c;也都有赚到钱的和赚不到钱的&#xff0c;那区别在哪里呢&#xff1f; 在你的源头&#xff0c;也就是教你或者说是代理加盟的上家&#…

机器学习实验 --- 逻辑回归

第1关:逻辑回归核心思想 任务描述 本关任务:根据本节课所学知识完成本关所设置的编程题 #encoding=utf8 import numpy as npdef sigmoid(t):完成sigmoid函数计算:param t: 负无穷到正无穷的实数:return: 转换后的概率值:可以考虑使用np.exp()函数#********** Begin *******…

景源畅信数字:抖音小店新手该怎么做?

在数字化时代的浪潮中&#xff0c;抖音不仅仅是一个分享短视频的平台&#xff0c;更是一个充满潜力的电商平台。对于想要进入这个领域的朋友们来说&#xff0c;开设一家抖音小店无疑是一个既激动又迷茫的起点。那么&#xff0c;作为新手&#xff0c;该如何在这个全新的舞台上立…

笔记 | 《css权威指南》

网络安全色 URL text-indent line-height & vertical-align 字体 font-weight 400 normal 700 bold background-attachment

iOS系统故障怎么办?这三种苹果手机系统修复方法你一定要知道

随着苹果手机使用时间越长&#xff0c;苹果手机有时也会出现系统问题&#xff0c;如卡顿、崩溃、无法启动等。这些问题不仅影响用户的使用体验&#xff0c;还可能导致数据丢失。因此&#xff0c;掌握苹果手机系统修复方法显得尤为重要。本文将详细介绍苹果手机系统修复的常见方…

MyBatis入门(1)

目录 一、JDBC操作回顾 二、什么是MyBatis&#xff1f; 三、MyBatis入门 1、准备工作 &#xff08;1&#xff09;创建工程 &#xff08;2&#xff09;数据准备 2、配置数据库连接字符串 3、写持久层代码 4、单元测试 &#xff08;1&#xff09;使用IDEA自动成成测试类…

UFS协议—新手快速入门(一)【1-4】

本篇旨在为初学者提供关于通用闪存存储&#xff08;UFS&#xff09;的快速入门指南。 目录 一、背景介绍 二、UFS 三、半双工和全双工 &#xff08;1&#xff09;半双工&#xff08;Half-Duplex&#xff09; &#xff08;2&#xff09;全双工&#xff08;Full-Duplex&…

【大模型】fineturn Q-wen

github上下载qwen1_5源码 修改finetun.sh 然后在路径qwen1_5/examples/sft下修改finetun.sh, 内容如下 #!/bin/bash export CUDA_DEVICE_MAX_CONNECTIONS1 DIRpwd# Guide: # This script supports distributed training on multi-gpu workers (as well as single-worker trai…

【HTML】制作一个跟随鼠标的流畅线条引导页界面(可直接复制源码)

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML代码&#xff0c;图中线条可跟随鼠标移动&#xff0c;具体内容如下&#xff1a; 开始 首先新建一个HTML的文本&#xff0c;文本名改为[index.html]&#xff0c;创建好后右…