python与C#互操作: pythonnet

11 篇文章 4 订阅

参考

pythonnet_github
为在python中使用dotnet程序安装clr
简单实现python调用c#dll动态链接库

测试

gitee 代码仓库

1、C# DLL类库

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PythonCallDll
{
    public class Class1
    {
        public string ClassName { get; set; }
        public static int _classObjectCounts = 0;
        public Class1()
        {
            ClassName = "PythonCallDll";
            _classObjectCounts = _classObjectCounts + 1;
        }
        public Class1(string name)
        {
            ClassName = name;
            _classObjectCounts = _classObjectCounts + 1;
        }
        public int AddCalc(int a, int b)
        {
            return a + b;
        }
        public void SayHello()
        {
            MessageBox.Show("hello");
        }
        public void SayHello(String name)
        {
            MessageBox.Show(name);
        }
    }
}

在这里插入图片描述

2、Python 调用dll

使用Pycharm+anaconda环境

# clr是公共运行时环境,这个模块是与C#交互的核心
import clr
import sys
from clr import System

sys.path.append(r'pythonProject')  # 加载c#dll文件路径,与py文件放在一个文件夹中
clr.FindAssembly('PythonCallDll.dll')  # 加载c#dll文件
a = clr.AddReference('PythonCallDll')  # 实例化C#类库?,这样可以调用?,比如这个类库的来源Location, 测试如果屏蔽这行,会报错,但对类的实例化和调用没有影响。
print(a)

from PythonCallDll import *  # 导入命名空间

# print(dir(Class1))
instance = Class1()     # 创建类的对象实例1,使用无参构造器
instance2 = Class1('object2')  # 创建类的对象实例2,使用有参构造器
print('Class1类的静态字段(对类的实例化次数计数)_classObjectCounts = ', Class1._classObjectCounts)
print('Class1类的实例1,调用方法AddCalc: 1+2= ', instance.AddCalc(1, 2))
print('Class1类的实例1,实例属性ClassName:',instance.ClassName)
print('Class1类的实例2,实例属性ClassName:',instance2.ClassName)
instance.SayHello()  # Class1类的实例1,调用无参方法SayHello
instance.SayHello('pythonnet')  # Class1类的实例1,调用有参方法SayHello

结果:
在这里插入图片描述
在这里插入图片描述

3、 遇到的一些问题

1、参考:python中调用 C#动态链接库问题记录

在这里插入图片描述

2、不使用 clr.AddReference(‘PythonCallDll’),程序执行效果:会报错,但程序运行结果依然正确。

在这里插入图片描述
在这里插入图片描述

3、sys.path.append(),相对路径和绝对路径

绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。
相对路径就是以当前文件为基准进行一级级目录指向被引用的资源文件。
以下是常用的表示当前目录和当前目录的父级目录的标识符
…/ 表示当前文件所在的目录的上一级目录
./ 表示当前文件所在的目录(可以省略)
/ 表示当前站点的根目录(域名映射的硬盘目录)

4、python中使用.net的Array类

from System import Array
myarray = Array[int](10) 
该句报错 TypeError:Type ex Cannot convert 10 to System.Int32[]

解决参考
执行时Arrayint会收到错误消息,看起来期望的参数不是大小,而是Python列表。以下对我有用:

py_array = [1, 2, 3]
net_array = Array[int](py_array)

现在,net_array.Length应该返回3。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值